fcntl() 함수에 대한 질문..
글쓴이: betterlife / 작성시간: 금, 2006/02/17 - 4:42오후
안녕하세요.
fcntl() 함수를 공부하다가 이해가 안되는 부분이 있어서...
file_status 에 분명히 아래와 같이 초기값을 줬는데 왜 결과가
다르게 나오는지 잘 모르겠습니다. 컴파일 가능한 짧은 소스를
올립니다.
#include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> static void check_file( int ); static int file_status = O_RDONLY | O_CREAT | O_TRUNC; int main( void ) { int fd; fd = open( "fcntl_test.temp", file_status, 00644 ); check_file( fd ); return 0; } static void check_file( int fd ) { int stat_flags, access_flag; stat_flags = fcntl( fd, F_GETFL, 0 ); access_flag = stat_flags & O_ACCMODE; if ( access_flag == O_RDONLY ) printf( "O_RDONLY" ); else if ( access_flag == O_WRONLY ) printf( "O_WRONLY" ); else if ( access_flag == O_RDWR ) printf( "O_RDWR" ); else printf( "unknown acess flag\n" ); if ( stat_flags & O_CREAT ) printf( " | O_CREAT " ); if ( stat_flags & O_EXCL ) printf( " | O_EXCL " ); if ( stat_flags & O_TRUNC ) printf( " | O_TRUNC" ); if ( stat_flags & O_APPEND ) printf( " | O_APPEND" ); if ( stat_flags & O_NONBLOCK ) printf( " | O_NONBLOCK" ); printf( "\n" ); }
제 생각에 따르면 O_CREAT 와 O_TRUNC 도 출력이 되야되는데
출력이 안됩니다. O_RDONLY 만 출력이 됩니다. 이 소스는
제가 공부하고 있는 책에 있는겁니다. 그런데 책에 나온 출력을
보면 O_RDONLY 만 출력이 되어 있습니다. O_RDONLY 만 출력
되는것이 맞는거 같은데 왜 그런지를 모르겠습니다. 초기값에는
3개를 줬는데 왜 한개만 나오는지.... 알려주시면 감사드리겠습니
다. 읽어주셔서 감사합니다.
========================================
T_T.. os 가 다르면 결과도 다른것일까요? 저는 레드햇9를 쓰고
있고 책에는 SunOS와 HP-UX 의 결과값으로 O_RDONLY 만
나와 있습니다...
Forums:
3개 다 나옵니다.
3개 다 나오는데요??
저는 O_RDONLY만 나옵니다. 왜 그런가 하는 것에 대한 답은 O_A
저는 O_RDONLY만 나옵니다. 왜 그런가 하는 것에 대한 답은 O_ACCMODE의 정의와 설명에 나와 있습니다. /usr/include/fcntl.h를 따라서 /usr/include/bits/fcntl.h를 열어 보면 플래그들이 정의되어 있는데,
라고 되어 있습니다. 인즉 O_ACCMODE는 '읽기-쓰기-둘다'라는 접근 방식만을 다루는 마스크입니다. 이는 fcntl.h에 대한 man페이지에서도 확인하실 수 있습니다.
달리 생각을 해보자면 O_CREAT, O_EXCL, O_NOCTTY, O_TRUNC 플래그는 파일을 여는 방식을 지정하는 플래그일 뿐, 열려있는 파일의 속성과는 관련이 없습니다. 그러니 일단 파일이 열리고 나면 의미가 없어지는 플래그이기에 fcntl(F_GETFL)로 얻어올 수 없다고 생각할 수도 있습니다.
$PWD `date`
댓글 달기