2011-01-09 19 views
8

Pracuję nad projektem C dla systemu Linux i mam problem z działaniem deskryptorów plików.Zmiana uprawnień do odczytu/zapisu deskryptora pliku

Mam sierocym deskryptor pliku (plik był otwarty(), a następnie unlink() 'd ale fd jest nadal dobry), który ma uprawnienia tylko do zapisu. Oryginalny plik kopii zapasowej miał pełne uprawnienia (utworzone za pomocą S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH), ale niestety plik został otwarty z O_WRONLY. Czy możliwe jest zduplikowanie deskryptora pliku i zmiana kopii na O_RDWR?

psudo-code:


//open orphan file 
int fd = open(fname, O_WRONLY, ...) 
unlink(fname) 
//fd is still good, but I can't read from it 

//... 

//I want to be able to read from orphan file 
int fd2 = dup(fd) 
//----change fd2 to read/write???---- 

Z góry dzięki! -Andrew

+4

'fcntl (fd, F_SETFL, fcntl (fd, F_GETFL) | O_RDWR))' * wygląda * tak jakby to było, z wyjątkiem strony man, która mówi, że to nie zadziała. Sądzę, że jest jakiś powód, dla którego jądro "potrzebuje", aby to było niemożliwe? – aschepler

+2

, więc dlaczego otwierasz go w trybie wronym, jeśli planujesz go przeczytać? –

+0

Lub po prostu otwórz ponownie, używając poprawnych flag. – jweyrich

Odpowiedz

6

Nie, nie ma funkcji POSIX do zmiany trybu otwartego. Będziesz musiał otworzyć go w trybie odczytu/zapisu. Ponieważ jednak utworzono tymczasowy plik, zdecydowanie zalecam korzystanie z mkstemp. Ta funkcja prawidłowo otwiera plik w trybie odczytu/zapisu i rozłącza go. Co najważniejsze, unika się warunków wyścigu podczas nazywania i tworzenia pliku, dzięki czemu unika się luki w tworzeniu plików tymczasowych.

+2

mkstemp nie odłączy AFAIK? –

+0

co powiedział MK. Zawsze mogę dodać O_EXCL do open() i spróbować ponownie po niepowodzeniu –

Powiązane problemy