2011-01-31 2 views
2

만약 내가 다음과 같은 C 코드를 가지고 : 나는 컴파일하고 실행하지 않을 경우 부당이 생성지구상의 무엇 ...? 파이썬 C 코드에 의해 생성 된 파일의 파일 권한

int main(int argc, char **arg) 
{ 
    int x = open("testfilefromc", O_RDWR | O_CREAT); 
    return 0; 
} 

:

-rw-r----- 1 joewass staff  0B 31 Jan 21:17 testfilefromc 

그러나 다음과 같은 C 코드를, 파이썬 모듈로 컴파일 :

const char *filename = "testfilefrompython"; 
context->fd = open(filename, O_RDWR | O_CREAT); 

이 수행합니다

---------- 1 joewass staff 165B 31 Jan 21:09 testfilefrompython 

놀랍지도 않지만 파일을 만든 코드는 다음 번에 열 수 없습니다!

왜 파일이 ​​제로 권한으로 생성됩니까? 그리고 C에서 컴파일 된 동작이 파이썬 모듈과 다른 이유는 무엇입니까? 코드를 실행하는 Python 프로그램을 실행하고 있습니다.

가치가있는 내용은 나중에 mmap입니다.

감사합니다.

편집 : 나는, 내가 chmod가이 문제를 해결 할 수있어 문제가 이유입니까?

EDIT 2 : 선택 사항이 아닌 선택적 인수가 누락되었음을 지적하기 위해 Rosh Oxymoron에게 감사드립니다. TRWTF은 첫 번째 예제가 전혀 작동하지 않는다는 것입니다!

+1

아마도 C 코드 어딘가에'umask()'를 호출했을 것입니까? –

+0

'strace'에서 코드를 실행하십시오. 'open' /'creat'과'chmod' /'fchmod' 호출에주의하십시오. –

+0

@ Frédéric - 내 코드에는 umask가 없습니다. 파이썬이 무엇을하고 있는지 누가 알겠는가! – Joe

답변

6

함수 open은 세 가지 인수를 취합니다. 당신이 O_CREAT 플래그를 지정하면,이 서명으로 호출해야합니다

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

그렇지 않으면 동작이 정의되지 않습니다. 첫 번째 예제에서 파일을 만드는 것이 전혀 불가능합니다. 또한 지정한 모드로 항상 ANDed 인 umask을 살펴보십시오.

+0

당신은 전적으로 옳다. 맨 페이지에서 그 단락을 놓쳤습니다. (Mac에서는'int open (const char * path, int oflag, ...); 문서화되어 있고 충분히 읽지는 않았습니다.) 고맙습니다! – Joe

관련 문제