프로그래밍 기술/리눅스(Unix) 시스템 프로그래밍

[리눅스/유닉스 시스템 프로그래밍] open, close

언제나휴일 2016. 4. 5. 23:00
반응형

3.2 open, close

 파일 입출력 작업을 위해 파일을 열 때 open 함수를 이용하고 작업을 마치고 파일을 닫을 때 close 함수를 이용합니다.

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

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

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

반환 값:실패 시 -1

#include <unistd.h>

int close(int fd);

반환 값: 실패 시 -1

 

 open 함수의 두번째 인자로 전달하는 flags는 파일의 내용을 읽기 위한 것인지 쓰기 위한 것이지 읽기 쓰기를 모두 하기 위한 것인지를 필수적으로 전달해야 합니다.

     O_READONLY : 읽기 전용

     O_WRONLY   : 쓰기 전용

     O_RDWR     : 읽기/쓰기 혼용

 

 그리고 선택적으로 사용할 수 있는 매크로 상수로 추가 모드나 생성, 파일의 내용을 지우기, 논 블로킹 모드로 입출력할 것인지 쓰기 작업을 요청하면 바로 물리적인 파일에 쓸 것인지를 결정할 수 있습니다.

     O_APPEND   : 이어쓰기 모드로 쓰기 작업을 하면 파일의 끝에 쓰기 수행

     O_CREAT    : 파일이 없을 때 생성 모드, 세 번째 인자를 요구함

     O_TRUNC    : 기존에 파일에 있던 내용을 잘라내어 파일의 크기를 0으로 만듦

     O_NONBLOCK : 논 블로킹 모드로 작업함

     O_SYNC     : 쓰기 작업을 요청하면 바로 물리적인 파일에 쓰여짐

 

 또한 O_CREAT 모드와 함께 O_EXCL을 사용하면 파일이 존재하는지 확인하여 존재할 때 -1을 반환합니다.

    O_EXCL     : 파일이 존재하는지 확인

 

 그리고 O_CREAT 모드로 지정할 때 세번째 인자로 생성하는 파일에 접근 권한을 지정할 수 있습니다. 만약 지정하지 않으면 0000(8진수 000)으로 설정합니다. 모드는 8진수 3자리 수를 지정할 수 있는데 첫번째 자리는 파일의 소유자의 읽기/쓰기/실행 권한을 의미하고 두번째 자리는 소유자그룹의 읽기/쓰기/실행 권한, 세번째 자리는 Other의 읽기/쓰기/실행 권한을 의미합니다.

 

 

 그리고 8진수의 상위비트는 읽기 권한, 두번째 비트는 쓰기 권한, 세번째 비트는 실행 권한을 의미합니다. 예를 들어 0755를 지정하면 사용자는 읽기/쓰기/실행 권한을 갖고 소유자 그룹과 Other는 읽기/실행 권한을 갖습니다. 이는 ls -al 명령을 통해 권한을 확인하면 rw-r--r--로 나타나는 것에 관한 것입니다.

 

 그리고 매크로 상수로 다음을 조합하여 세번째 인자로 사용할 수 있습니다.

   S_IRUSR    : 소유자 읽기 허용   S_IWUSR    : 소유자 쓰기 허용   S_IXUSR    : 소유자 실행 허용

   S_IRGRP    : 그룹 읽기 허용      S_IWGRP    : 그룹 쓰기 허용     S_IXGRP    : 그룹 실행 허용

   S_IROTH    : Other 읽기 허용    S_IWOTH    : Other 쓰기 허용   S_IXOTH    : Other 실행 허용

 

 Linux에서는 man 명령어를 이용하여 man open처럼 확인해 보면 보다 자세한 정보를 얻을 수 있습니다. 여러분께서는 O_CREAT, O_EXCL, O_TRUNC 등의 flags 옵션을 조합하여 다양한 테스트를 해 보세요.

//ex_open1.c

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

#include <stdio.h>

#include <stdlib.h>

int main(int argc,char **argv)

{

    int fd = 0;

    if(argc != 2)

    {

        printf("Usage %s [filename]\n",argv[0]);

        exit(0);

    }

    fd = open(argv[1],O_WRONLY);

    if(fd<0)

    {

        perror("failed open file");

        exit(0);

    }

    printf("successed open file %s and fd:%d\n",argv[1],fd);

    close(fd);

    return 0;

}

  

 

 다음 ex_touch.c 소스 파일은 touch 명령어와 비슷한 기능을 수행하는 프로그램 코드입니다. 여기에서는 생성하고자 파일과 함께 권한을 8진수로 입력하면 세 자리의 8진수로 입력하면 부여한 권한에 맞게 파일을 생성합니다. 그리고 생성을 요청한 파일이 존재할 때는 이미 존재한다고 경고 메시지를 보여주고 아무런 작업도 수행하지 않습니다.

// ex_touch.c

#include <stdio.h>

#include <fcntl.h>

int main(int argc,char **argv)

{

    int fd = 0;

    if(argc != 3)

    {

        fprintf(stderr,"usage: %s [file name] [access mode]\n",argv[0]);

        fprintf(stderr,"access mode is octet number, ex:0755\n");

        return 1;

    }

    mode_t mode = 0;

    sscanf(argv[2],"0%o",&mode);

    fd= open(argv[1],O_WRONLY|O_CREAT|O_EXCL,mode);

    if(fd == -1)

    {

      perror("failed open ");

      return 1;

    }

    printf("success open %s\n",argv[1]);

    close(fd);

    return 0;

}

$ ./ex_touch dummy 0644

success open dummy

$ ./ls -l dummy

-rw-r--r-- 1 ehpub ehpub    0 2015-02-14 09:30 dummy


반응형