2012-12-11 12 views
5

Ich muss eine temporäre Datei in meinem C-Programm erstellen, schreiben Sie einige Daten, und rufen Sie dann einen externen Befehl (über exec oder System), um einige Verarbeitung für die Datei, die ich gerade erstellt habe. Ich habe den externen Befehl nicht geschrieben, und es ist auch nicht machbar, ihn in mein Programm zu integrieren, daher glaube ich nicht, dass ich einen bereits geöffneten Deskriptor damit teilen kann. Daher muss ich den Namen der erstellten temporären Datei kennen.Wie öffne ich eine temporäre Datei und bekomme ihren Dateinamen?

Die Funktion tempname() tut dies, aber leider empfiehlt sie, sich nicht selbst zu verwenden, wegen einer möglichen Wettlaufsituation zwischen dem Abrufen des Namens und dem Öffnen der Datei und keiner der von ihr empfohlenen Funktionen (tmpfile und mkstemp) bieten eine Möglichkeit, den tatsächlichen Namen der erstellten Datei herauszufinden.

+2

'mkstemp' gibt den Namen zurück; Es wird das übergebene Template-Argument modifizieren (welches ein char * ist, kein const char *), welches die X's durch die tatsächlichen Werte ersetzt. – Joe

Antwort

5

Es ist nicht wahr, dass mkstemp nicht funktioniert können Sie die temporären Dateinamen kennen, versuchen, dieses Programm zu kompilieren und ausführen, sich zu sehen:

#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 die Dateinamen-Vorlage im Puffer ersetzen Sie passieren dazu mit dem tatsächlichen Dateinamen, können Sie später mit diesem Puffer machen, was Sie wollen.

+0

Ah, richtig du bist. Nicht sicher, wie ich es verpasst habe, die Manpage zu lesen. Vielen Dank! – Michael

+0

Ich merke, dass wenn ich einen String wie oben übergeben übergeben bekomme ich einen segfault in __gen_tempname. Wenn ich es durchhalte, dann nicht. Dies kann plattformabhängig sein, aber ich würde vermuten, dass in einigen Fällen String-Konstanten in ein schreibgeschütztes Segment gestellt werden. – Michael

+1

@Michael Ich glaube, der Code ist in Ordnung. Beachten Sie, dass ich 'fn' nicht als Zeiger auf' char' deklariert habe. Es ist tatsächlich ein lokales Array (es ist auf dem Stapel) mit den String-Literal-Daten initialisiert. – piokuc