2016-10-03 3 views
0

나는 코드의 일부가액세스 모드() SYS 호출 리눅스 C

if(mkdir(name, 0666/*permission*/) == -1) 
      { 
         printf("ERROR"); 
         return ERROR; 
      } 

나는 다른 사람에 대한 쓰기 권한이 그것을 원하지만

drw-rw-r-- 2 atg atg 4096 Oct 3 17:54 f,,, 

같이 새로 생성 된 디렉토리는 보인다 즉 drw-rw-rw-입니다.

내가 cd를 사용하여 디렉토리를 입력하려고 할 때, 나는 bash는

얻을 : CD : F :이처럼, 그것은 실행 권한으로 만드는 경우 권한이

거부 ​​:

if(mkdir(name, 0777/*permission*/) == -1) 
       { 
          printf("ERROR"); 
          return ERROR; 
       } 

나는

drwxrwxr-x 2 atg atg 4096 Oct 3 18:00 f 
를 얻을 수

cd으로 디렉토리를 입력 할 수 있습니다. 내가 왜 쓰기 권한이

DR-XR-XR-X 2 ATG의 ATG 4096 10월 3일 18시 2분 F

설정되지 얻을

if(mkdir(name, 0777/*permission*/) == -1) 
      { 
         printf("ERROR"); 
         return ERROR; 
      } 

?

내가 umask를 확인

case RD_WRT_DATA: 
          permission = 0666; 
          break; 

    if(mkdir(name, permission) == -1) 
    { 
       printf("ERROR"); 
       return ERROR; 
    } 

    else 
    { 
     return SUCCESS; 
    } 
    if(chmod(name, permission) == -1) 
    { 
     printf("ERROR"); 
     return ERROR; 

    } 
    else 
    { 
     return SUCCESS; 
    } 

로 chmod를 사용 : 내가 얻을

여전히
grep UMASK /etc/login.defs 

UMASK  022 

권한은 -> 나는

drw-rw-r-- 2 atg atg 4096 Oct 3 18:15 f 

을 umask를 변경해야합니까? 그 일을하지 않으면 어떤 대안이 있습니까?

+1

가'이다 DRW--RW RW-'_ - 당신이 확신? 즉, 아무도 디렉토리 내의 아무 것도 액세스 할 수 없습니다. 당신은 이름 (x' 당신은'perror는 사용해야 – mata

+0

거의 쓸모가'없이'r'을 (당신이 무엇을 알고있는 경우) x'가 디렉토리의 콘텐츠에 액세스하고,'r'는 내용을 나열하는 것이 아니라 '필요)'(대신의 printf ("ERROR"'의) 변화와의 umask를 복원하는 것은 여전히 ​​멀티 스레드 애플리케이션에서 안전하지이라고 –

답변

0

시도 umask가 새로 만든 디렉토리의 권한에 영향을 때문에, mkdir 전에

umask(0); 

를 호출.

2

실행 권한이없는 디렉터리는 나열 할 수 없습니다.

umask(0)을 설정하는 것 외에도 0777 모드로 디렉터리를 만듭니다.

0

대부분의 리눅스 배포판은 기본값 umask = 022을 사용합니다. 즉, mkdir777 권한으로 전화하면 권한 : 777(asked) - 022(umask) = 0755(actual)이됩니다.

0 : read, write and execute 
1 : read and write 
2 : read and execute 
3 : read only 
4 : write and execute 
5 : write only 
6 : execute only 
7 : nothing 

umask(0)를 확인하고 사용자가 만든 디렉토리에 대한 사용 권한 777 물었다 얻을 것이다 : 사실, umask 각 8 진수의 의미 새로 생성 된 파일/DIRS에서 제거되어야 하는지를 권한 입니다.

2

과정의 umask 값은 비 소유자의 쓰기 권한이 떨어져 마스킹된다. https://en.wikipedia.org/wiki/Umask 참조 : 컴퓨팅에서

, umask를 파일 권한이 새로 만든 파일을 설정하는 방법을 제어하는 ​​ 마스크의 설정을 결정하는 명령입니다. 또한 마스크를 설정하는 기능을 의미 할 수있다, 또는 그것은 정식 파일 모드 생성 마스크라고도 마스크 자체를 참조 할 수있다. 마스크는 해당 권한이 새로 만든 파일 설정 방법을 을 제한 각각의 비트의 그룹입니다.

umask 값은 프로세스에 대해 전역입니다. 따라서 값을 변경 한 후 만들어지는 모든 자식 프로세스와 함께 프로세스에서 실행중인 모든 스레드에 영향을 미칠 것입니다 umask()를 호출.

안전하게 과정의 나머지 부분에 영향을주지 않고 파일이나 디렉토리 권한을 보장하기 위해, 당신은 명시 적으로 chmod()과 권한을 설정해야합니다

int rc; 
mode_t mode = 0777; 

rc = mkdir(name, mode); 
if (0 == rc) 
{ 
    rc = chmod(name, mode); 
} 
. 
. 
. 

당신이 정말로 변화 umask()을 원한다면, 그것을 설정하는 것이 훨씬 낫다 당신이 필요로하고 는 이후 복원 : 필요한 권한 _but

mode_t old_mask = umask(0); 
int rc = mkdir(name, 0777); 
umask(old_mask); 
+1

참고 오류 처리에 대한'...), 다른 스레드가 사용하게 될 때문에이 기간 동안 umask를 수정 그 사이의 시간. – Arnout