2013-03-21 10 views
5

Mam deskryptor pliku, który jest ustawiony na wartość dodatnią z wynikiem funkcji open(), więc ten fd wskazuje plik. Kiedy usuwam rzeczywisty plik fd jest nadal dodatnią liczbą całkowitą. Chcę wiedzieć, że jeśli usunę jakiś plik z jakiegoś powodu, to skąd mogę wiedzieć, że ten deskryptor pliku nie jest już prawidłowy. W skrócie, skąd mogę wiedzieć, że plik, który pokazuje fd, nadal tam jest. Próbuję to zrobić w C na FreeBSD.Jak sprawdzić, czy plik nadal istnieje przy użyciu deskryptora pliku

+0

Spróbuj wpisać lub odczytać plik. To powinno zwrócić błąd. – RedX

+2

@RedX to nie działa jak UNIX. – LtWorf

+0

Tak, wiem, że muszę przeczytać lub otworzyć ten plik, ale czy istnieje sposób na otwarcie lub odczytanie pliku za pomocą tylko fd? czy istnieje funkcja io do odczytywania lub otwierania za pomocą tylko fd, bez ścieżki lub FILE * –

Odpowiedz

4

Systemy uniksowe umożliwiają usuwanie otwartych plików (lub raczej usuwanie wszystkich odniesień do pliku z systemu plików). Ale deskryptor pliku jest nadal ważny nadal ważny. Wszelkie połączenia do odczytu i zapisu będą udane, tak jak w przypadku nazwy pliku.

Innymi słowy, nie można całkowicie usunąć pliku, dopóki deskryptor pliku nie zostanie zamknięty. Po zamknięciu plik zostanie automatycznie usunięty.

Przy użyciu prawidłowego deskryptora pliku można sprawdzić, czy nazwa pliku nadal istnieje, np.

printf("%d\n", buf.st_nlink); // 0 means no filenames 

Gdzie buf jest struct stat zainicjowane fstat.

+0

Dzięki za poradę, ale to inna sytuacja, z którą się spotykam. Muszę tylko sprawdzić, czy plik, który pokazuje fd, nadal tam jest. Jeśli nie, to w jaki sposób nauczyć się tego poprzez fd? –

+1

@HasanBozok - Możesz użyć 'fstat' na poprawnym deskryptorze pliku, aby uzyskać liczbę twardych linków. Jeśli wynosi 0, nazwy plików zostały usunięte. – teppic

+0

@teppic, Czy istnieje sposób, aby [nazwa pliku ioctl] (http://pubs.opengroup.org/onlinepubs/009696699/functions/ioctl.html) rzeczywiście spowodował usunięcie pliku? Gdyby to było możliwe, byłoby to niebezpieczne? –

1

Przed zapisaniem do pliku można sprawdzić, czy jest tam jeszcze użyciu access()

if (access("/yourfile",W_OK)!=-1) { 
    //Write on the file 
} 

można też zrobić fstat na Eurovoc:

struct stat statbuf; 
fstat(fd,&statbuf); 
if (statbuf.st_nlink > 0) { 
    //File still exists 
} 

Ale będzie to spowolnić swoje oprogramowanie w dół wiele, a także jakiś program może połączyć plik gdzie indziej i odłączyć oryginalną nazwę, aby plik nadal istniał, ale pod inną nazwą/lokalizacją, a ta metoda nie wykryłaby tego.

Znacznie lepszą alternatywą byłoby użycie inotify na GNU/Linux lub kqueue na bsd, ale nigdy nie korzystałem z drugiej.

Możesz używać tych interfejsów API do oglądania zmian w katalogach i otrzymywania powiadomień z jądra oraz pobierania zdarzenia, gdy twój plik jest usuwany przez jakiś inny proces, i zrób coś z tym.

Należy pamiętać, że zdarzenia te nie są wykonywane w czasie rzeczywistym, więc można nadal używać pliku przez kilka milisekund przed jego uzyskaniem.

Powiązane problemy