2011년7월14일_저수준 파일입출력관련 함수와 옵션정리


1. open( )


# man 2 open

imageimageimage
image

※ 적으려고 하였으나 너무 복잡하여 스크린샷을 삽입합니다.


● open( )의 사용법

   1:  //열기실패시 -1반환, 성공시 파일디스크립터 (장치 = 파일)
   2:  //현재 실행되는 디렉토리에서 상대경로나 절대경로에 있는 파일명과,
   3:  //flags(접근 목적/방법)와 퍼미션설정을 인자로 넘겨줌.
   4:  int open(const char *pathname, int flags);
   5:  int open(const char *pathname, int flags, mode_t mode);


● flags

flags

의미

O_APPEND

0x0001

쓰기용으로 파일을 열어, 파일의 끝을 현재위치로 설정한다.

O_CREAT

0x0002

쓰기용으로 파일을 생성한다. 파일이 이미 존재하면 효과가 없다.

O_EXCEL

0x0004

O_CREAT와 함께 사용되어 파일이 이미 존재할 경우 오류값을 반환

O_RDONLY

0x0100

읽기 전용으로 파일을 연다.

O_RDWR

0x0200

읽고 쓰기용으로 파일을 연다.

O_TRUNC

0x0400

파일을 열고 내용을 삭제하여 파일의 길이를 0으로 만든다.

O_WRONLY

0x0800

쓰기전용으로 파일을 연다.

O_BINARY

0x4000

이진 모드로 파일을 연다. (리눅스는 항상 바이너리모드이다.)

O_TEXT

0x8000

텍스트 모드로 파일을 연다.

flags의 값들은 상호배타적이기 때문에 경우에 따라서는 여러 개의 값을 주어야 하는데 이 경우에는 비트 OR연산자 ’|’ 사용
   ex) 파일생성과 파일내용지움과 쓰기모드: 
       open(fd, O_CREAT | O_TRUNC | O_WRONLY);


● mode

pmode 의미
S_IWRITE 0x00400 사용자 쓰기 허용
S_IREAD 0x00200 사용자 읽기 허용
S_IEXEC 0x00100 사용자 실행 허용

☆ flags와 같이 OR연산으로 조합해서 사용할 수 있다.
☆ VMWare의 리눅스공유폴더에서는 파일속성이 제대로 되지 않는다




2. close( )


image
짧아서 좋아~



//바빠서 close( ), read( ), write( )는 사용법만 작성


● close( )의 사용법

   1:  //에러시 -1을 반환, 성공시 0을 반환
   2:  //파일디스크립터(file discriptor)를 인자로 넘겨주는 그 파일디스크립터를 소멸시키라 부탁함.
   3:  int close(int fd);


3. read( )

● read( )의 사용법

image
   1:  // ssize_t는 singed 버스크기를 갖는 자료형이고,
   2:  // 파일읽기 실패시 -1을 반환하고, 성공시 읽은 자료의 바이트수를 반환한다.
   3:  // 파일디스크립터와 파일의 내용을 담을 버퍼(메모리)의 주소와 읽을 바이트수를 인자로 넘겨준다.
   4:  ssize_t read(int fd, void *buf, size_t count);



4. write( )

● write( )의 사용법

image
   1:  // 파일쓰기 실패시 -1을 반환하고, 성공시 쓴 자료의 바이트수를 반환한다.
   2:  // 파일디스크립터와 파일의 내용이 담긴 버퍼(메모리)의 주소와 쓸 데이터의 바이트수를 인자로 넘긴다.
   3:  ssize_t write(int fd, const void *buf, size_t count);


5. 추가

● 덤으로 프로그램예제 p11-9.c

   1:  //입력 데이터 파일의 내용을 새로운 출력파일을 생성하여 복사하는 프로그램
   2:  #include <stdio.h>
   3:  //#include <io.h>
   4:  #include <string.h>
   5:  #include <sys/types.h>        //pmode
   6:  #include <sys/stat.h>        //pmode
   7:  #include <fcntl.h>            //oflag사용
   8:   
   9:  #define BUFFERSIZE    512
  10:  #define file "d1009.in"
  11:   
  12:  int main()
  13:  {
  14:      int infd;
  15:      int bytes;
  16:      int i;
  17:      int outfd;
  18:      char buffer[BUFFERSIZE];
  19:      //const char *file = "d1009.in";
  20:      
  21:      close(0);    //키보드 닫음
  22:   
  23:   
  24:      //파일오픈-오류 발생시 -1을 반환
  25:      //if((infd = open("d1009.in", O_RDONLY)) < 0)
  26:      if((infd = open(file, O_RDONLY)) < 0)
  27:      {
  28:          perror("Can't open file d11-9.in\n");
  29:          return -1;
  30:      }
  31:   
  32:      //if((outfd = open("d1009.out", O_CREAT | O_WRONLY, S_IWRITE)) < 0)
  33:      if((outfd = open("d1009.out", O_CREAT | O_WRONLY)) < 0)
  34:      {
  35:          printf("Can't open file d11-9.out\n");
  36:          return -1;
  37:      }
  38:      
  39:      printf("%d\n", infd);
  40:      printf("%d\n", outfd);
  41:   
  42:      //read()함수는 EOF일 경우 0을 반환
  43:      while((bytes = read(infd, buffer, BUFFERSIZE)) > 0)
  44:      {
  45:          for(i = 0 ; i < bytes ; i++)
  46:          {
  47:              putchar(buffer[i]);        //화면에 출력
  48:          }
  49:   
  50:          write(outfd, buffer, bytes);
  51:      }
  52:   
  53:      
  54:      close(infd);
  55:      close(outfd);
  56:   
  57:      return 0;
  58:  }