2017-02-14 8 views
0

존재하지 않는 파일을 열려면 다음 C 코드를 작성했습니다. 나는 ls -l 명령을 실행할 때 umask를 0002로 설정되어 있지만C에서 open() 함수로 만든 파일의 기본 액세스 모드는 무엇입니까?

#include<stdio.h> 
#include<fcntl.h> 
#include<unistd.h> 
#include<sys/stat.h> 
#include<sys/types.h> 

int main(){ 
    int fd = open("test.c",O_WRONLY | O_CREAT); 
    printf("%d\n",fd); 
    close(fd); 
} 

, 내가 만든 파일에 대한 다음과 같은 출력을 얻을.

-r--rws--T 1 urohit011 urohit011  0 Feb 14 22:35 test.c 

새 파일 이름으로 코드를 실행하면 액세스 모드가 변경됩니다. 여기에 두 가지 질문이 있습니다.

  • 해당 파일의 기본 액세스 모드는 0002 인의 umask 이후 664을해야하지?
  • 코드가 새 파일 으로 실행될 때 액세스 모드가 변경되는 이유는 무엇입니까?
+0

''test.c "'를 파일 이름으로 사용 하시겠습니까? 소스 파일을 덮어 쓰지 않기를 바랍니다. –

+0

@Someprogrammerdude "test.c"라는 이름은 프로그램을 실행하기 전에 존재하지 않으므로 문제가 될 것이라고 생각하지 않습니다. –

답변

4

mode/permission 비트는 open 호출의 세 번째 인수로 지정됩니다. 당신은 그 인수를 제공하지 않고 그 O_CREAT를 사용하는 자동 프로그래밍 오류입니다 :

O_CREAT 또는 O_TMPFILEflags에 지정된 경우 제공해야이 인수 (mode); O_CREAT 또는 O_TMPFILE이 지정되지 않으면 mode은 무시됩니다.


해당 파일의 기본 액세스 모드가 있어야하지 않나요 664을 umask를 명시 적으로 제공해야합니다 0002

기본 mode이기 때문에 :

open("test.c",O_WRONLY | O_CREAT, 0666) 
            ^^ 

코드가 새 파일 이름으로 실행될 때 액세스 모드가 변경되는 이유는 무엇입니까? 값이 제공되지 않았 으면

int open(const char* file, int flag, ...); 

따라서, 함수의 인수 제 불확정 값으로 초기화 얻는다 :

open 2 개 이상의 인수를 받아들이 variadic function이다. 인수가 2 개만 제공된 경우 컴파일러 오류가 발생하지 않습니다. 반면에 항상 open 호출에 세 번째 인수를 제공하는 것은 오류가 아닙니다.

+0

당신 자신이 인용 한 문서는 제 3 인자가 선택 사항이라는 것을 분명하게 보여줍니다. – arkascha

+1

@arkascha 정말요? _이 인수는 플래그에'O_CREAT' 또는'O_TMPFILE'가 지정되었을 때 제공되어야합니다; 'O_CREAT'도 아니고'O_TMPFILE'도 지정되어 있지 않으면, 모드는 무시됩니다. _ –

+0

아, 고맙습니다. 나는 그대가 그러한 발언을하지 않았기 때문에 답을 문자 적으로 그리고 절대적으로 취했다. – arkascha

0

생성 된 파일의 액세스 모드는 open(2) 호출에서 세 번째 매개 변수로 지정해야합니다. C가 일을하는 방식 때문에 세 번째 매개 변수 (두 번째 매개 변수에 사용 된 플래그에 따라 허용됨)는 open(2)을 가변적으로 호출하고 컴파일러는 올바른 수의 매개 변수를 제공했는지 확인하지 않습니다.

이 때문에 세 번째 매개 변수를 전달하지 않으면 호출 코드에 의해 스택으로 푸시되지 않지만 함수는 세 번째 매개 변수의 위치에있는 값을 사용합니다.최상의 결과가 잘못된 액세스 모드로 새 파일을 가져 오는 중 정의되지 않은 동작 문제가 발생했습니다. open(2) 루틴이 세 번째 매개 변수를 수정하면 충돌이 발생할 수 있습니다.

제공 한 액세스 모드는 최종적으로 umask 비트로 수정되어 생성 된 파일의 최종 모드를 가져옵니다.