lseek 시스템 호출


#include <sys/types.h>

#include <unistd.h>


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


앞에서 파일 포인터에 대해 배웠다.

lseek 시스템 호출은 이 파일 포인터를 임의의 위치로 변경할 수 있게 해준다.


첫 번째 인수는 파일 기술자이고, 두 번째 인수는 파일 포인터의 새 위치를 결정하는데, 세 번째 인수에서 더해질 바이트 수를 지정한다.

세 번째 인수는 두 번째 인수가 어느 위치를 기준으로 하여 더해질지 위치의 기준으로 다음과 같다.

  • SEEK_SET : offset을 파일의 시작위치부터 계산한다.
  • SEEK_CUR : offset을 파일 포인터의 현재 위치부터 계산한다.
  • SEEK_END : offset을 파일의 끝부터 계산한다.
두 번째 인수는 (off_t)로 캐스팅해주는 것에 유의해야한다.
lseek 시스템 호출의 반환값은 파일 안의 새로운 위치이거나 오류 발생시 -1을 반환한다.
off_t 타입은 <sys/types.h>에 정의되어 있으므로, 이 헤더파일은 include해준다.

다음의 예를 보자.

off_t newpos;
..
...
newpos = lseek(fd, (off_t) -8, SEEK_END);


오류가 발생하지 않는다면 newpos는 새로운 위치 값을 반환받을 것이다.

위에서 말한대로 두 번째 인수는 (off_t)로 캐스팅해주었다.

여기서 두 번째 인수 offset의 값은 음수가 가능하다. 즉, 파일 포인터에서 거꾸로 이동하는 것이 가능하다는 것이다.

만약 파일의 시작점보다 더 앞으로 움직일 때에는 오류가 발생할 것이다!

또한 파일의 끝보다 더 뒤의 위치로 이동을 할 수가 있는데, 이 때에는 읽기를 위한 자료를 존재하지 않지만 파일이 확장하게 된다.

이 경우 실제로 물리적으로 할당은 되지 않지만, ASCII null 문자로 채워진다.


※ 파일 오픈 후 파일 포인터 맨 끝에 위치시키기

fd = open("myfile", O_RDWR);

lseek(fd, (off_t) 0, SEEK_END);


fd = open("myfile", O_RDWR | APPEND);

 

위의 예시 둘 다 파일 포인터를 맨 끝에 위치시킨다!

+ Recent posts