UNIX 프로그래밍

2013.08.30_UNIX_파일I/O_연산 및 함수

성엽이 2013. 8. 30. 14:36


3.1 원자적 연산들

  - 하나의 연산이 여러 단계로 구성되어 있으며 그 단계들 모두가 수행되거나 아니면 하나도 수행되지 않음을 보장될 때, 그러한 연산을 가리켜

    '원자적 연산(atomic operation)' 이라고 부른다.

    예를 들어서 A와 B 라는 사람이 완전히 똑같은 시간에 비행기표를 같은 번호로 인터넷으로 예약을 하였을 때,

    한사람만 예약이 되거나, 중복으로 예약이 되거나 하는 일이 발생하면 안된다. 이때 원자적 연산을 보장받지 못했다. 라고 말할 수 있다.  


    

         - pread , pwrite 함수 


 #include <unistd.h>


 ssize_t pread(int filedes, void *buf, size_t nbytes, off_t offset)                반환값 : 읽은 바이트 수, 파일 끝이면 0, 오류 시 -1


 ssize_t pwrite(int filedes, const void *buf, size_t nbytes, off_t offset)

 ▶ pread 호출은 lseek 호출 후 read 를 호출한 것과 동일한 효과지만, 약간 차이가 있다. pwrite도 마찬가지다.

   - pread의 연산을 도중에 가로챌 수 없다. ( 프로세스가 완료되기 전까지 연산이 도중에 인터럽트 걸리진 않는다.)

   - 파일 포인터가 갱신되지 않는다.

   즉, 원자적 연산을 한다.

 

         

         - dup, dup2 함수


 #include <unistd.h>

 

 int dup(int filedes);


 int dup2(int filedes, int filedes2);                    반환값(둘다) : 성공 시 새 파일 서술자, 오류 시 -1

#include <stdio.h>

#include <unistd.h>

int main()
{
  int ifd;

  write(1,"TEST\n",5);  
  
  ifd = dup(1);

  printf("Since write dup ,ifd = %d\n", ifd);

  write(ifd,"TEST\n",5);  

  
  return 0;
}

 => dup 함수를 이용해서 file descriptor 번호 3번에 write file descriptor 가 ifd 로 복사가 되고, 이를 다시 사용한 소스 




3.2 sync함수, fsync함수, fdatasync함수

  - 디스크 I/O 연산들은 버퍼에 대기열에 등록해두고, 나중에 적당한 시점이 되면 디스크에 기록하게 됨. 이 방식을 '지연된 쓰기(delayed write)' 라고 부른다.


 sync() 

 업데이트가 주기적으로 호출됨. 기록연산이 완료될 때 까지 기다리지 않는다.

 fsync()

 디스크의 쓰기들이 완료될 때 까지 대기했다가 반환된다.

 fdatasync()

 fsync() 와 비슷한데 파일의 자료 부분에만 영향을 미친다. fsync() 는 파일의 자료와 특성까지  동기적으로 갱신한다.



 3.3 fcntl함수

  - 이미 열려있는 파일의 특성들을 변경 할 수 있다(소스상에서). linux 의 경우 chmode이고, 이는 명령어로 그 특성을 변경할 수 있다. 추가설명은 아직 수업이 없었음