2012-12-11 10 views
5

Potrzebuję utworzyć tymczasowy plik w moim programie C, napisać do niego trochę danych, a następnie wywołać zewnętrzne polecenie (przez exec lub system), aby wykonać pewne przetwarzanie na właśnie utworzonym pliku. Nie napisałem polecenia zewnętrznego ani nie jest możliwe zintegrowanie go z moim programem, więc nie sądzę, żebym mógł podzielić się z nim już otwartym deskryptorem. Dlatego muszę znać nazwę utworzonego pliku tymczasowego.Jak mogę otworzyć plik tymczasowy ORAZ uzyskać jego nazwę?

Funkcja tempname() robi to, ale niestety nie zaleca używania samego siebie, ze względu na możliwy stan wyścigu między uzyskaniem nazwy a otwarciem pliku i żadną z funkcji, które poleca (tmpfile i mkstemp) zapewniają sposób na znalezienie rzeczywistej nazwy utworzonego pliku.

+2

'mkstemp' zwraca nazwę; zmodyfikuje przekazany argument szablonu (który jest char *, a nie const char *), zastępując X wartościami rzeczywistymi. – Joe

Odpowiedz

5

Nie jest prawdą, że mkstemp nie pozwala poznać nazwę pliku tymczasowego, spróbuj skompilować i uruchomić ten program, aby zobaczyć siebie:

#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 zastąpi szablon nazwy pliku w buforze mijamy do niego z rzeczywistą nazwą pliku, możesz zrobić cokolwiek chcesz z tym buforem później.

+0

Ach, prawda jesteś. Nie wiem, jak bardzo tęskniłem za przeczytaniem strony man. Dzięki! – Michael

+0

Zauważając, że jeśli przekażę ciąg przypisany tak jak powyżej, otrzymam segment w __gen_tempname. Jeśli to zrobię, to nie. Może to być zależne od platformy, ale przypuszczam, że w niektórych przypadkach stałe łańcuchowe są umieszczane w segmencie tylko do odczytu. – Michael

+1

@Michael Uważam, że kod jest OK. Zauważ, że nie zadeklarowałem 'fn' jako wskaźnika do' char'. W rzeczywistości jest to lokalna tablica (jest na stosie) zainicjowana za pomocą danych literowych ciągu. – piokuc

Powiązane problemy