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`
댓글 달기