2011-01-09 23 views
8

Sto lavorando a un progetto Linux e ho problemi a lavorare con i descrittori di file.Modifica permessi di lettura/scrittura su un descrittore di file

Ho un descrittore di file orfani (il file è stato aperto() 'd quindi scollega()' d ma il file fd è ancora valido) che dispone dell'autorizzazione di sola scrittura. Il file di supporto originale aveva permessi completi (creati con S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH), ma purtroppo il file è stato aperto con O_WRONLY. È possibile duplicare il descrittore di file e cambiare la copia in 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???---- 

Grazie in anticipo! -Andrew

+4

'fcntl (fd, F_SETFL, fcntl (fd, F_GETFL) | O_RDWR))' * sembra * come se fosse la cosa, ad eccezione della pagina man specifica che non funzionerà. Immagino ci sia qualche ragione per cui il kernel "ha bisogno" di questo per essere impossibile? – aschepler

+2

quindi perché lo apri in modalità wronly se prevedi di leggerlo? –

+0

Oppure semplicemente riaprilo usando i flag corretti. – jweyrich

risposta

6

No, non esiste alcuna funzione POSIX per modificare la modalità di apertura. Sarà necessario aprirlo in modalità lettura/scrittura. Poiché si è creato un file temporaneo, tuttavia, si consiglia vivamente di utilizzare mkstemp. Questa funzione apre correttamente il file in modalità lettura/scrittura e lo scollega. Soprattutto, evita una condizione di competizione nel nominare e creare il file, evitando in tal modo una vulnerabilità nella creazione di file temporanei.

+2

mkstemp non scollega AFAIK? –

+0

cosa ha detto MK. Posso sempre aggiungere O_EXCL per open() e riprovare a fallire –

Problemi correlati