2012-04-13 2 views
6

디렉토리 (mkdir 복제본)를 만드는 간단한 C 프로그램을 작성하려고합니다.Posix에서 C를 사용하여 오른쪽 permissons로 디렉토리를 만드는 방법

#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; 
} 

이 코드는 d---------와 디렉토리를 생성하지만 MKDIR 할 것처럼 drwxr-xr-x 그것을 만들 : 이것은 내가 지금까지 가지고 무엇인가? 여기서 내가 뭘 잘못하고 있니?

편집

: umask에 따라 바로 권한 설정

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

자동으로 처리됩니다 이 나를 위해 작동 솔루션입니다. 그래서 전체 권한을 가진 mkdir 만 호출하면됩니다. 현재 umask에 따라 잘게됩니다.

+0

진단 인쇄물은 무엇을 생산합니까? '% i' 다음에 개행 문자를 추가하면 더 잘 작동 할 수 있습니다.'% i' 대신'% o' 또는'.4o'를 사용하면 더 쉽게 읽을 수 있습니다. 또한, ['umask()'] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/umask.html)과 ['mkdir()']을 선언 한'#include ' (http://pubs.opengroup.org/onlinepubs/9699919799/functions/mkdir.html). –

+0

그것은 % 4o로 22를 생성합니다. – yasar

답변

0

을 에릭이 말했듯이, 당신이 얻을 실제 사용 권한 모드의 보완의 umask입니다. 마스크 자체를 mkdir()에 전달하는 대신 0777-maskmkdir()으로 전달해야합니다.

+0

감사합니다. 실제로 올바른 권한을 얻기 위해 umask를 통합하려고합니다. 0777-mask를 0777 & ~ mask로 변경했습니다. :) – yasar

+0

실제로 umask를 직접 사용하지 않아도됩니다. 왜냐하면 makdir은 이미 그것을 수행하기 때문입니다. 그래서 umask가 022 일 때'drwxr-xr-x' 디렉토리에 0777 결과를 사용합니다. – yasar

7

무엇을 umask으로 오해하고있는 것 같습니다. 그래서에서

real_mode = requested_mode & ~umask 

: IT/정보 차례로 파일 모드에서 비트 떨어져 차례에 사용되는 프로세스의 파일 모드 생성 마스크, 당신은 같은이 (pseduo 코드), mkdir처럼 통화에서 지정을 검색 설정 귀하의 코드는 umask 자체의 값을 전달하기 때문에 사용 권한을 0으로 지정하게됩니다.

대신 다음과 같이 mkdir에 전화에서 원하는 권한을 지정해야합니다

mkdir("trial", 0755) 
+3

yasar11732는 현재 사용자의 umask 설정을 통합하려고하며 하드 코딩은 '0755'가 아닙니다. 내 추측. –

+1

일반적으로 응용 프로그램에서 사용자의 umask를 엉망으로 처리 할 필요는 없습니다. libc는 이미'mkdir()'에서 당신을 위해 그것을합니다. 따라서 0755 또는 0775를 하드 코딩하는 것은 완벽합니다. –

+4

내가'umask 0'이면? 0755를 하드 코딩하면 원하는 0777 대신 0755가됩니다. yasar11732가 주석 처리 했으므로 0777을 하드 코딩하는 것이 더 정확할 수도 있지만'0777 & ~ mask'에는 유해하지 않습니다. –

관련 문제