[리눅스 시스템 프로그래밍] 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>
#include <unistd.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>
#include <unistd.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;
}
[그림 3.2] ex_touch 실행 화면
[그림 3.2] ex_touch 실행 화면