2012-12-11 23 views
5

C programımda geçici bir dosya oluşturmalı, ona biraz veri yazmalı ve sonra oluşturduğum dosya üzerinde işlem yapmak için harici bir komutu (exec veya system aracılığıyla) çağırmalıyım. Harici komutu yazmam, ne de onu programıma entegre etmem mümkün olmadı, bu yüzden onunla zaten açık bir açıklayıcıyı paylaşabileceğimi düşünmüyorum. Bu nedenle, oluşturulan geçici dosyanın adını bilmem gerekiyor.Geçici bir dosyayı nasıl açabilirim ve dosya adını nasıl alabilirim?

Tempname() işlevi bunu yapar, ancak maalesef adı alma ve dosyayı açma arasındaki olası bir yarış durumu ve önerilen işlevlerin hiçbiri (tmpfile ve mkstemp) arasında kendini kullanmamanızı önerir.) oluşturulan dosyanın gerçek adını bulmak için bir yol sağlar.

#include <stdlib.h> 
#include <stdio.h> 

int main() 
{ 
    char fn[] = "/tmp/fileXXXXXX"; 
    int fd = mkstemp(fn); 
    char cmd[200]; 
    int n = snprintf(cmd, sizeof(cmd), "ls -l %s\n", fn); 

    printf("snprintf=>%d\n sizeof(fn)=%d\n", n, sizeof(fn)); // extra info, see comments 

    printf("%s\n", cmd); 
    return system(cmd); 
} 

mkstemp geçmek tamponu içinde dosya adı şablonu yerini alacak:

+2

'mkstemp', adı döndürür; X'in gerçek değerlerle değiştirilmesiyle iletilen şablon argümanını (char *, const char * değil) değiştirecektir. – Joe

cevap

5

O mkstemp, derlemek ve kendini görmek için bu programı çalıştırmak için deneyin geçici dosya adını bildirmek olmadığı doğru değildir gerçek dosya adı ile, daha sonra bu tampon ile ne istersen yapabilirsin.

+0

Ah, doğru sensin. Adam sayfasını okumayı nasıl özlediğimi bilmiyorum. Teşekkürler! – Michael

+0

Yukarıda yaptığınız gibi atanan bir dizeyi iletirsem __gen_tempname'de bir segfault aldığımı farkettim. Eğer strdup edersem, o zaman yapmam. Bu, platforma bağlı olabilir, ancak bazı durumlarda dize sabitlerinin salt okunur bir bölüme yerleştirildiğini tahmin ediyorum. – Michael

+1

@Michael Kodun iyi olduğuna inanıyorum. Dikkat et, 'char' için bir işaretçi olarak bildirmedim. Aslında, dize değişmez verileriyle başlatılan yerel bir dizidir (yığındadır). – piokuc