#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int open(const char *pathname, int flages, [mode_t mode]);
@ fcntl.h에 정의된 flag 상수값
O_RDONLY : read only
O_WRONLY : write only
O_RDWR : read/write
O_CREAT : 파일이 존재하지 않으면 생성,존재하면 아무런 영향을 주지 않음
O_TRUNC : 파일이 존재하면 파일의 내용을 null로 한다
O_EXCL : 지정한 파일이 존재하면 open되지 않는다
O_APPEND : 파일의 쓰기를 할때 파일의 포인터가 파일의 끝에 위치
반환값:
--------------------------------------------------------
Error -1
정상 음이 아닌 정수(파일 디스크립터)
예시:
--------------------------------------------------------
fd = open("data", O_RDONLY)
존재 파일 open / 없으면 error 발생!
fd = open("/tmp/newfile",O_WRONLY | O_CREAT, 0644)
새로운 파일 생성
fd = open("file", O_WRONLY | O_CREAT | O_EXCL, 0644)
파일이 존재하면 error
fd = open(("file", O_WRONLY | O_CREAT | O_TRUNC, 0644)
새로운 파일 생성, 존재해도 무시
fd = open(("file", O_WRONLY | APPEND)
파일 뒤에 첨부
사용법
#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);
int creat(const char *pathname, mode_t mode);
설명
open 은 시스템호출로, 파일을 열거나 생성 할때 사용한다. 성공하면 해당파일을 지시하는 int 형의 파일지시자를 되돌려준다. path_name 은 생성하고자 하는 파일이름을 나타낸다. 보통 full path 이름을 적어주며, 단지 파일이름만 적을경우에는 현재 경로에 파일이 생성된다.
flag 는 파일을 어떠한 mode 로 열것인지를 결정하기 위해서 사용한다. "읽기전용", "쓰기전용", "읽기/쓰기" 모드로 열수 있다. 이들 모드 선택을 위해서 O_RDONLY, O_WRONLY, O_RDWR 이 존재 한다.
또한 다음중 하나이상의 mode 를 bitwise 연산시킬수도 있다.
- O_CREAT
만약 pathname 파일이 존재하지 않을경우 파일을 생성한다.
- O_EXCL
O_CREAT 를 이용해서 파일을 생성하고자 할때, 이미 파일이 존재한다면, 에러를 되돌려주며 파일을 생성하는데 실패한다. 이러한 특성때문에 때때로 잠금파일을 만들기 위해 사용되기도 한다.
- O_APPEND
파일이 추가모드로 열린다. 파일의 위치는 파일의 끝이된다.
- O_NONBOLOCK, O_NDELAY
파일이 비봉쇄 모드로 열린다.
- O_NOFOLLOW
경로명이 심볼릭 링크라면, 파일열기에 실패한다.
- O_DIRECTORY
경로명이 디렉토리가 아니라면 파일열기에 실패한다.
- O_SYNC
입출력 동기화 모드로 열린다. 모든 write 는 데이타가 물리적인 하드웨어에 기록될때까지 호출 프로세스를 블록시킨다.
또한 mode 를 이용해서 에 파일의 권한을 지정해 줄수도 있다.
- S_IRWXU
00700 모드로 파일 소유자에게 읽기, 쓰기, 쓰기 실행권한을 준다.
- S_IRUSR
00400 으로 사용자에게 읽기 권한을 준다.
- S_IWUSR
00200 으로 사용자에게 쓰기 권한을 준다.
- S_IXUSR
00100 으로 사용자에게 실행 권한을 준다.
- S_IRWXG
00070 으로 그룹에게 읽기, 쓰기, 실행 권한을 준다.
- S_IRGRP
00040 으로 그룹에게 읽기권한을 준다.
- S_IWGRP
00020 으로 그룹에게 쓰기권한을 준다.
- S_IXGRP
00010 으로 그룹에게 실행권한을 준다.
- S_IRWXO
00007 으로 기타 사용자 에게 읽기, 쓰기, 실행 권한을 준다.
- S_IROTH
00004 으로 기타 사용자 에게 읽기 권한을 준다.
- S_IWOTH
00002 으로 기타 사용자 에게 쓰기 권한을 준다.
- S_IXOTH
00001 으로 기타 사용자 에게 실행 권한을 준다.
반환값
에러가 발생하면 -1 을 반환하며, 성공했을경우에는 새로운 파일 지시자를 반환한다. 에러시에는 적당한 errno 값이 설정된다.
에러
- EEXIST
O_CREAT 와 O_EXECL 이 같이 사용되었을경우 발생한다. 이미 경로파일이 존재할경우 발생된다.
- EACCES
파일 접근이 거부될경우이다. 주로 권한 문제 때문에 발생한다.
- ENOENT
경로명의 디렉토리가 없거나, 심볼릭 링크가 깨져있을때.
- ENOENT
경로명의 디렉토리가 없거나, 심볼릭 링크가 깨져있을때.
- ENODEV
경로명이 장치파일을 참고하고, 일치하는 장치가 없을때.
- EROFS
경로명이 read-only 파일시스템을 참조하면서, 쓰기로 열려고 할때.
- EROFS
경로명이 read-only 파일시스템을 참조하면서, 쓰기로 열려고 할때.
- EFAULT
경로명이 접근할수 없는 주소강간을 가르킬때
- ELOOP
심볼릭 링크가 너무 많을때.
// /usr/my.temp 파일을 읽기 전용으로 열고자 할때
fd = open("/usr/my.temp", O_RDONLY);
...
close(fd);
// 파일을 쓰기 전용으로 생성하며, 파일의 권한은 644 로 한다.
// 만약 이미 파일이 존재한다면 에러가 발생할것이다.
fd = open("/usr/my.temp", O_CREAT|O_EXCL|O_WRONLY, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);
...
close(fd);
예제1:
--------------------------------------------------------
#include <fcntl.h>
#include <unistd.h>
main()
{
int fd;
ssize_t nread; // ssize_t 은 int
char buf[1024];
fd=open("data", O_RDONLY);
nread=read(fd,buf,1024);
close(fd);
}
예제2:
--------------------------------------------------------
#include <stdlib.h>
#include <fcntl.h>
#define PERMS 0644
char *filename="newfile";
main()
{
int fd;
if((fd = open(filename, O_RDWR | O_CREAT, PERMS)) == -1)
{
printf("Couldn't create %s\n", filename);
exit(1);
}
printf("Create filename \n");
exit(0);
}