2011-01-09 21 views
8

Estoy trabajando en un proyecto de linux C y tengo problemas para trabajar con los descriptores de archivos.Cambiar los permisos de lectura/escritura en un descriptor de archivo

Tengo un descriptor de archivo huérfano (el archivo estaba abierto() 'd luego desvincular()' d pero el fd sigue siendo bueno) que tiene permiso de solo escritura. El archivo de respaldo original tenía permisos completos (creado con S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH), pero lamentablemente el archivo se abrió con O_WRONLY. ¿Es posible duplicar el descriptor de archivo y cambiar la copia a O_RDWR?

psudo-código:


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

Gracias de antemano! -Andrew

+4

'fcntl (fd, F_SETFL, fcntl (fd, F_GETFL) | O_RDWR))' * parece * como si fuera la cosa, excepto que la página del manual dice específicamente que no funcionará. Supongo que hay alguna razón por la cual el kernel "necesita" que esto sea imposible. – aschepler

+2

entonces, ¿por qué lo abre en modo wronly si planea leerlo? –

+0

O simplemente ábralo de nuevo usando las banderas correctas. – jweyrich

Respuesta

6

No, no hay una función POSIX para cambiar el modo abierto. Tendrá que abrirlo en modo lectura/escritura. Sin embargo, como le crearon un archivo temporal, le recomiendo que use mkstemp. Esa función abre correctamente el archivo en modo de lectura/escritura y lo desvincula. Lo que es más importante, evita una condición de carrera al nombrar y crear el archivo, lo que evita una vulnerabilidad en la creación de archivos temporales.

+2

mkstemp no desvincula AFAIK? –

+0

lo que dijo MK. Siempre puedo agregar O_EXCL para abrir() y volver a intentar el error –

Cuestiones relacionadas