C언어 파일 열기 함수 open()

2020. 3. 14. 11:26 컴퓨터/프로그래밍

C함수 파일 열기 open()

파일을 사용하기 위해 열기(open)합니다. 파일 열기에는 표준 함수인 fopen()이 있습니다. fopen() 이 표준 C 라이브러리에서 제공한다면 open()은 리눅스에서 제공하는 함수입니다.

  • 헤더: fcntl.h
  • 형태: int open (const char *FILENAME, int FLAGS[, mode_t MODE])
  • 인수: char *FILENAME 대상 파일 이름
    int FLAGS 파일에 대한 열기 옵션
    [, mode_t MODE] O_CREAT 옵션 사용에 의해 파일이 생성될 때 지정되는 파일 접근 권한
  • 반환: int 0 < 파일 열기에 성공하면 파일 디스크립터의 양의 정수 값 반환
    -1 == 실패
reference

파일을 open할 때는 용도에 따라 읽기 전용, 쓰기 전용 또는 읽기와 쓰기가 모두 되는 옵션을 지정하여 열기를 합니다. 아래의 옵션은 모두 fcntl.h 에 정의되어 있습니다.

열기 옵션 설명
O_RDONLY 읽기 전용응로 열기
O_WRONLY 쓰기 전용으로 열기
O_RDWR 읽기와 쓰기가 모두 가능

이 외에도 더 다양한 옵션이 있습니다.

기타 옵션 설명
O_CREAT

해당 파일이 없으면 생성합니다.

O_CREATE 가 아니라 끝에 E가 없는 O_CREAT 입니다.

O_CREAT로 파일을 생성하게 된다면 파일의 접근권한을 지정하기 위해 접근 권한 값을 추가해야 합니다.

open( "jwmx", O_WRONLY | OCREAT, 0644);

O_EXCL

O_CREAT를 사용했을 때, 파일이 이미 있어도 열기가 가능하여 쓰기를 하면 이전 내용이 사라집니다.

O_CREAT를 사용할 때, O_EXCL를 함께 사용하면, 이미 파일이 있을 때에는 open() 되지 않아 이전 파일을 보존할 수 있습니다.

fd = open( "./test.txt", O_WRONLY | O_CREAT | O_EXCL, 0644)

즉, 이렇게 O_EXCL을 함께 사용하면, 파일이 없을 경우에는 O_CREAT 영향을 받아 쓰기 전용의 파일이 생성하고, 파일이 이미 존재하면 open()이 실패됩니다.

O_TRUNC 기존의 파일 내용을 모두 삭제합니다.
O_APPEND 파일을 추가하여 쓰기가 되도록 open 후에 쓰기 포인터가 파일의 끝에 위치하게 됩니다.
O_NOCITTY 열기 대상이 터미널일 경우, 이 터미널이 플로그램의 제어 터미널로 할당하지 않습니다.
O_NONBLOCK 읽을 내용이 없을 때에는 읽을 내용이 있을 때까지 기다리지 않고 바로 복귀합니다.
O_SYNC 쓰기를 할 때, 실제 쓰기가 완료될 때 까지 기다립니다. 즉, 물리적으로 쓰기가 완료되어야 복귀하게 됩니다.

예제

예제에서는 test.txt라는 파일이 없으면 파일을 생성하고 파일 않에 "forum.falinux.com"을 쓰기를 합니다. 그러나 이미 파일이 있다면 프로그램을 종료합니다.

#include <stdio.h>         // printf()
#include <string.h>        // strlen()
#include <fcntl.h>         // O_WRONLY
#include <unistd.h>        // write(), close()

int main()
{
   char  *temp = "badayak.com\n";
   int    fd;

   if ( 0 < ( fd = open( "./test.txt", O_WRONLY ¦ O_CREAT ¦ O_EXCL, 0644))) {
      write( fd, temp, strlen( temp));
      close( fd);
   } else {
      printf( "파일 열기에 실패했습니다.\n");
   }
   return 0;
}

실행 결과

]$ ./a.out
]$ cat ./test.txt
badayak.com
]$


이 댓글을 비밀 댓글로

티스토리 로그인이 풀리면 여기를 클릭하세요.

    • c언어 배우는 중
    • 2020.07.11 23:44
    신기 방기.. 좋은 글 감사합니다!
    O_EXCL부분 설명 보면서 왜 O_TRUNC가 필요할까 생각했는데
    직접 만져보니까 있는 이유가 있는 거군요!
    • C언어를 학습하시고 계시나봐요. C언어는 좀 난해한 부분이 있고,
      최근 언어에 비하면 부족한 부분도 있지만,
      시간이 꽤 지났어도 강력한 매력은 꾸준합니다. ^^
error: Content is protected !!