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을 파일의 끝부터 계산한다.
오류가 발생하지 않는다면 newpos는 새로운 위치 값을 반환받을 것이다.
위에서 말한대로 두 번째 인수는 (off_t)로 캐스팅해주었다.
여기서 두 번째 인수 offset의 값은 음수가 가능하다. 즉, 파일 포인터에서 거꾸로 이동하는 것이 가능하다는 것이다.
만약 파일의 시작점보다 더 앞으로 움직일 때에는 오류가 발생할 것이다!
또한 파일의 끝보다 더 뒤의 위치로 이동을 할 수가 있는데, 이 때에는 읽기를 위한 자료를 존재하지 않지만 파일이 확장하게 된다.
이 경우 실제로 물리적으로 할당은 되지 않지만, ASCII null 문자로 채워진다.
※ 파일 오픈 후 파일 포인터 맨 끝에 위치시키기
fd = open("myfile", O_RDWR);
lseek(fd, (off_t) 0, SEEK_END);
fd = open("myfile", O_RDWR | APPEND);
위의 예시 둘 다 파일 포인터를 맨 끝에 위치시킨다!
'개발 > System' 카테고리의 다른 글
리눅스의 파일 시스템 (0) | 2012.10.28 |
---|---|
UNIX 파일 접근 프리미티브 : 파일 제거 (0) | 2012.10.28 |
UNIX 파일 접근 프리미티브 : write 시스템 호출 (0) | 2012.10.28 |
UNIX 파일 접근 프리미티브 : read 시스템 호출 (0) | 2012.10.28 |
UNIX 파일 접근 프리미티브 : close 시스템 호출 (0) | 2012.10.28 |