2009-02-27 19 views
10

Estoy escribiendo un programa que escribe salida en un archivo. Si este archivo no existe, quiero crearlo.Usando la llamada al sistema open()

Actualmente, estoy usando los siguientes indicadores al llamar abierto: O_WRONLY | O_CREATE

Sin embargo, cuando este crea el archivo, no me da ningún permiso para escribir en él ...

¿Cómo puedo usar abierta de modo que se crea un archivo si no existe, pero lo creará con los permisos necesarios cuando sea necesario?

Gracias!

Respuesta

17

Probablemente necesite el tercer argumento. Por ejemplo:

 
open('path',O_WRONLY|O_CREAT,0640); 
+0

¡Eso fue exactamente! ¡Gracias! – samoz

+1

Tengo una ligera preferencia por el uso que @ David hace de las constantes del indicador (S_IRUSR | S_IWUSER | S_IRGRP | S_IROTH) en lugar de las permanentes con codificación fija, pero de lo contrario es una buena respuesta. –

+0

Sí, su respuesta es mejor. El mío es simplemente un rápido indicador del tercer argumento (¡mi cadena ni siquiera es válida!). –

1

En Linux hay un tercer argumento que puede usar para aprobar permisos. S_IWUSR debería ser la bandera para otorgarle permisos de escritura, pero en la práctica probablemente quiera usar más banderas que solo esa (bitwise or'd together). Consulte la página de manual para obtener una lista de los indicadores de permiso.

1

Desde el manual:

O_CREAT

Si el archivo existe, esta bandera no tiene ningún efecto excepto como se indica a continuación bajo O_EXCL . De lo contrario, el archivo será creado; la ID de usuario del archivo deberá establecerse en la identificación de usuario efectiva del proceso ; la ID de grupo del archivo se debe establecer en la ID de grupo del directorio principal del archivo o en el ID de grupo efectivo del proceso; y los bits de permisos de acceso (ver ) del modo de archivo se se establecen en el valor de la tercera argumento tomado como tipo mode_t modificada de la siguiente manera: una operación AND se realiza en los bits de modo de archivo y los bits correspondientes en el complemento de la máscara de creación de modo de archivo del proceso. Por lo tanto, se borran todos los bits en el modo de archivo cuyo bit correspondiente en la máscara de creación de archivo se establece. Cuando se configuran bits que no sean el archivo , el efecto es no especificado. El tercer argumento no afecta si el archivo está abierto para leer, escribir o para ambos. Las implementaciones proporcionarán un método para inicializar el ID de grupo del archivo al ID de grupo del directorio principal. Las implementaciones pueden, pero no es necesario, proporcionar un camino definido por la implementación para inicializar la ID de grupo del archivo a el ID de grupo efectivo del proceso de llamada .

Parece que necesita pasar un tercer argumento especificando los permisos de archivo deseados.

12

sólo tiene que utilizar el tercer argumento opcional a open:

int open(const char* pathname, int flags, mode_t mode); 

así como esto:

open("blahblah", O_CREAT | O_WRONLY, S_IRUSR | S_IWUSER | S_IRGRP | S_IROTH); 

Ver man open(2).

+4

Eso sería 'man 2 open'. – mgold

+1

No es 'S_IWUSER' .. su' S_IWUSR' –

0

Tenga en cuenta que en POSIX (Unix, Linux, MacOS, etc.) puede abrir y crear un archivo con todos los permisos que elija, incluido 0 (sin permiso para nadie) y aún escribir en el archivo si se abre para escritura .

Cuestiones relacionadas