컴퓨터공부/C & C++ & STL

open - 파일이나 장치를 열고 생성

achivenKakao 2006. 5. 18. 09:23

#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);
}