2012-12-11 21 views
5

Ho bisogno di creare un file temporaneo nel mio programma C, scrivere alcuni dati su di esso, e quindi invocare un comando esterno (tramite exec o system) per fare un po 'di elaborazione sul file che ho appena creato. Non ho scritto il comando esterno né è possibile integrarlo nel mio programma, quindi non penso di poter condividere con esso un descrittore già aperto. Pertanto, ho bisogno di conoscere il nome del file temporaneo creato.Come posso aprire un file temporaneo E ottenere il suo nome file?

Il tempname() la funzione fa questo, ma purtroppo consiglia di non utilizzare per sé, a causa di una possibile condizione di competizione tra ricevendo il nome e l'apertura del file, e nessuna delle funzioni che raccomanda (tmpfile e mkstemp) fornire un modo per scoprire il nome effettivo del file creato.

+2

'mkstemp' restituisce il nome; modificherà l'argomento template passato (che è un char *, non un const char *) che sostituisce le X con i valori attuali. – Joe

risposta

5

Non è vero che mkstemp non consente di conoscere il nome del file temporaneo, provare a compilare ed eseguire questo programma per vedere voi stessi:

#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 andrà a sostituire il modello di nome di file nel buffer si passa ad esso con il nome del file effettivo, puoi fare quello che vuoi con questo buffer in seguito.

+0

Ah, giusto sei. Non sono sicuro di quanto mi sia mancato leggendo la pagina man. Grazie! – Michael

+0

Notando che se passo una stringa assegnata come sopra hai un segfault in __gen_tempname. Se lo faccio, allora non lo faccio. Questo può dipendere dalla piattaforma, ma suppongo che in alcuni casi le costanti di stringa vengano inserite in un segmento di sola lettura. – Michael

+1

@ Michael Credo che il codice sia OK. Si noti che non ho dichiarato 'fn' come puntatore a' char'. In realtà è un array locale (è in pila) inizializzato con i dati letterali delle stringhe. – piokuc