2011-01-09 6 views
8

Ich arbeite an einem Linux C-Projekt und habe Probleme beim Arbeiten mit Dateideskriptoren.Lese-/Schreibberechtigungen für einen Dateideskriptor ändern

Ich habe eine verwaiste Datei-Deskriptor (die Datei war open() 'd dann unlink()' d aber die fd ist immer noch gut), die nur Schreibberechtigung hat. Die ursprüngliche Sicherungsdatei hatte vollständige Berechtigungen (erstellt mit S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH), aber leider wurde die Datei mit O_WRONLY geöffnet. Ist es möglich, den Dateideskriptor zu duplizieren und die Kopie in O_RDWR zu ändern?

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???---- 

Vielen Dank im Voraus! -Andrew

+4

'fcntl (fd, F_SETFL, fcntl (fd, F_GETFL) | O_RDWR))' * scheint * als wäre es die Sache, außer die Manpage sagt ausdrücklich, dass das nicht funktionieren wird. Ich denke, es gibt einen Grund, warum der Kernel dies "braucht", um unmöglich zu sein. – aschepler

+2

also warum öffnest du es im wrony-modus, wenn du vorhast, es zu lesen? –

+0

Oder öffnen Sie es einfach erneut mit den richtigen Flags. – jweyrich

Antwort

6

Nein, es gibt keine POSIX-Funktion, um den Öffnungsmodus zu ändern. Sie müssen es im Lese-/Schreibmodus öffnen. Da Sie jedoch eine temporäre Datei erstellt haben, wird dringend empfohlen, mkstemp zu verwenden. Diese Funktion öffnet die Datei ordnungsgemäß im Lese-/Schreibmodus und entkoppelt sie. Vor allem vermeidet es eine Race-Bedingung beim Benennen und Erstellen der Datei, wodurch eine Schwachstelle bei der Erstellung von temporären Dateien vermieden wird.

+2

mkstemp hebt AFAIK nicht auf? –

+0

was MK sagte. Ich kann O_EXCL immer zu open() hinzufügen und bei fehlgeschlagenem Versuch wiederholen –