UNIX 프로그래밍

2013.08.29_UNIX 프로그래밍_3장_파일 I/O

성엽이 2013. 8. 29. 16:19

3장 파일 I/O 

- 파일 입/출력에 사용하는 함수 : open, read, write, lseek, close 

- 비버퍼링(unbuffered I/O)방식



 3.1 open 함수

 #include <fcntl.h>


 int open(const char *pathname, int oflag, ... /* mode_t mode */);


 반환값 : 성공 시 파일 서술자, 오류 시 -1

- 반드시 지정해야하는 상수

 O_RDONLY  : 읽기 전용으로 열기

 O_WRONLY 쓰기 전용으로 열기

 O_RDWR     읽기 및 쓰기용으로 열기

 - 선택적 상수
 O_APPEND : 파일 기록 시 내용을 파일의 끝에 추가한다.
 O_CREAT   : 파일이 존재하지 않으면 새로 생성한다.
 O_EXCL     : O_CREAT 와 같이 지정하고, 파일이 이미 존재하는 경우에 오류가 발생 ( -1 반환 )

 O_TRUNC   : 이미 존재하는 파일을 읽기 및 쓰기 모드로 열었을 때, 파일의 크기를 0 으로 만들어 준다.( 내용을 다 지움 )

 O_NOCTTY 해당 장치를 가리키는 경우 , 해당 장치를 제어 터미널로 배정하지 않도록 한다. 쉽게 말해 제어장치로 가는 길을 막음.

    /* 읽기/쓰기 모드로 모뎀 장치를 연다.(O_RDWR)

     데이터 전송 시에 <CTRL>-C 문자가 오면 프로그램이 종료되지 않도록

     하기 위해 controlling tty가 안되도록 한다.(O_NOCTTY) */

   if ((fd = open(MODEMDEVICE, O_RDWR)) > 0)// | O_NOCTTY );

   {

         printf("file descripter is %d ---\n\r", fd);

   }

 O_NONBLOCK : 블록 특수 파일 , 문자 특수 파일, 블로킹이 되는 I/O 작업들에 대해서 블로킹을 해제해준다.

 - 선택적 상수 ( 동기 입출력 옵션 )
 O_DSYNC : 연 파일의 기존 부분에 자료를 덮어 쓰는 경우 파일의 시간을 동기적으로 갱신되지 않는다.
 O_RSYNC 원래 읽기영역은 동기화되어있지만, 읽기를 위해 타데이타(access time)을 사전에 바꾸고 읽기를 시작한다.
 O_SYNC   항상 갱신된다.

[출처] O_NOCTTY - o



 3.2 close 함수 

  #include <unistd.h>

 

 int close(int filedes);


 반환값 : 성공 시 0 , 오류 시 -1 


 : 프로세스의 열린 파일들을 모두 자동으로 닫는다.


 

 3.3 lseek 함수

 #include <unistd.h>


 off_t lseek(int filedes, off_t offset, int whence);


 반환값 : 성공 시 새 파일 오프셋, 오류 시 -1

 whence 에 SEEK_SET 이면 시작으로 부터 떨어진 정도

 whence 에 SEEK_CUR 이면 현재 위치에서 offset 을 더한 값

 whence 에 SEEK_END 이면 끝에서 부터 떨어진 정도


※ I/O 의 효율성 : BUFFSIZE 의 크기를 다르게 해주었을 때, 입/출력 시에 속도의 차이가 났다. 책을 참고하여 최적의 BUFFSIZE 를 확인 후 사용하는 것이 좋겠다.


3.4 파일 공유 

 

 커널( : OS 라 보면됨 ) 은 모든 프로세스에 대한 정보를 가진 프로세스 테이블을 관리 함.

 위 그림을 보듯이 fd 0 ( 파일 입력 ) 을 했을 때, 파일 포인터를 이용해 파일테이블과 그 파일의 정보를 가지고있는 v노드테이블을 가리킨다.

 유사하게 fd 1 ( 파일 출력 ) 도 마찬가지다. CPU는 1:1 로 프로세스를 관리할 수 있기 때문에 프로세스 테이블 항목들로 나눠서 관리를 한다.

 

======  소스  ======