2012-04-13 13 views
6

Estoy tratando de escribir un programa C simple que crea directorios (un clon mkdir). Esto es lo que tengo hasta ahora:Cómo crear un directorio con permisos derechos usando C en Posix

#include <stdlib.h> 
#include <sys/stat.h> // mkdir 
#include <stdio.h> // perror 

mode_t getumask() 
{ 
    mode_t mask = umask(0); 
    umask (mask); 
    return mask; 
} 

int main(int argc, const char *argv[]) 
{ 
    mode_t mask = getumask(); 
    printf("%i",mask); 

    if (mkdir("trial",mask) == -1) { 
     perror(argv[0]); 
     exit(EXIT_FAILURE); 
    } 
    return 0; 
} 

Este código crea directorio con d---------, pero quiero que se crean con drwxr-xr-x como mkdir hacer? ¿Qué estoy haciendo mal aquí?

Editar: Esta es la solución de trabajo para mí:

int main(int argc, const char *argv[]) 
{ 
    if (mkdir("trial",0777) == -1) { 
     perror(argv[0]); 
     exit(EXIT_FAILURE); 
    } 
    return 0; 
} 

Establecer permisos adecuados según la máscara de usuario se maneja de forma automática. Así que solo necesitaba llamar a mkdir con todos los permisos, y eso se corta según la umask actual.

+0

¿Qué produce la impresión de diagnóstico? Podría funcionar mejor si agregó una nueva línea después del '% i', y sería más fácil de leer si usó'% o' o '% .4o' en lugar de'% i'. Además, parece que falta '#include ' que declara ['umask()'] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/umask.html) y ['mkdir()'] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/mkdir.html). –

+0

Produce 22 con% 4o. – yasar

Respuesta

0

Como dice Eric, máscara de usuario es el complemento del modo de permiso real que se obtiene. Por lo tanto, en lugar de pasar la máscara a mkdir(), debe pasar 0777-mask a mkdir().

+0

Gracias, de hecho, quería incorporar umask para obtener el permiso correcto. Sin embargo, cambié 0777-mask por 0777 & ~ mask. :) – yasar

+0

En realidad, no necesito usar umask directamente, ya que, en apariencia, mkdir ya lo hace. Entonces, usar 0777 da como resultado un directorio con 'drwxr-xr-x' cuando mi umask es 022 – yasar

7

Parece que no entiende bien para qué se usa umask. En él se establecen/recupera la máscara del proceso de creación de modo de archivo, que a su vez se utiliza para desvío bits en el modo de archivo que especifique en las llamadas como mkdir, como esto (pseduo de código):

real_mode = requested_mode & ~umask 

Así que en su código, ya que transfiere el valor de umask en sí mismo, termina especificando permisos como cero, que es exactamente lo que ve.

lugar, usted debe especificar los permisos que desee en la llamada a mkdir, así:

mkdir("trial", 0755) 
+3

Creo que yasar11732 quiere incorporar la configuración umask del usuario actual, no la codificación difícil '0755'. Solo mi conjetura. –

+1

Normalmente no hay necesidad de meterse con umask del usuario en una aplicación; libc ya lo hace por ti en 'mkdir()'. Así que hardcoding 0755 o 0775 está perfectamente bien. –

+4

¿Qué pasa si me 'umask 0'? Hardcoding 0755 lo convertirá en 0755 en lugar de 0777 deseado. Quizás el código duro 0777 es más correcto, como comentó yasar11732, pero no es dañino para '0777 & ~ mask'. –

Cuestiones relacionadas