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
'프로그래밍 기술 > 리눅스(Unix) 시스템 프로그래밍' 카테고리의 다른 글
[리눅스/유닉스 시스템 프로그래밍] fnctl, sync, fsync (0) | 2016.04.05 |
---|---|
[리눅스/유닉스 시스템 프로그래밍] dup, dup2 (0) | 2016.04.05 |
[리눅스/유닉스 시스템 프로그래밍] 파일 테이블과 파일 디스크립터 테이블 (2) | 2016.04.05 |
[리눅스/유닉스 시스템 프로그래밍] lseek (0) | 2016.04.05 |
[리눅스/유닉스 시스템 프로그래밍] read, write (0) | 2016.04.05 |
[리눅스/유닉스] 파일 입출력 (0) | 2016.04.05 |
[리눅스/유닉스 시스템 프로그래밍] 파일 시스템 (0) | 2016.04.05 |
[리눅스/유닉스 시스템 프로그래밍] GCC 컴파일러 사용법 (0) | 2016.04.05 |
[리눅스/유닉스 시스템 프로그래밍] 리눅스 (0) | 2016.04.05 |
[리눅스/유닉스 시스템 프로그래밍] 들어가기에 앞서 (0) | 2016.04.05 |