파일을 열어 이젠 원하는 위치로 자연스럽게 파일의 위치(?), 커서(?)를 lseek() 시스템 콜을
이용하여 이동해보겠습니다.
시스템 프로그래밍을 하다보면 어떤 경우 파일의 내가 원하는 위치로 커서를 이동시키고 싶은 경우가 있습니다. 그럴 때 자주 사용되는데요, lseek()이란 시스템 콜을 이용하면 된답니다.
#include <unistd.h> #include<sys/types.h> off_t lseek (int fd, off_t pos, int origin) | ||
입력 인자 | int fd | open() 시스템 콜로 열린 파일을 가리키는 파일 지정 번호 |
off_t pos | 파일에 이동할 위치 지정 | |
origin | lseek() 시스템 콜에 인자(아래 표 참고) | |
반환값 | off_t | 파일 쓰기 성공 : 파일의 새로운 오프셋 파일 쓰기 실패 : -1 |
위의 내용을 보면 어느 정도 이해가 가실텐데요, 입력 인자 중 origin에는 어떤 값들이 들어갈 수 있는지 알아보겠습니다. Origin은 파일에 위치 시킬 커서를 어떻게 설정할 것 인가를 알려주는 인자입니다.
인자명 | 설명 |
SEEK_CUR | 현재 파일 오프셋에서 pos 값을 더한 값으로 설정한다. pos 값은 음수, 양수, 0 모두 가능하다 |
SEEK_END | 현재 파일의 크기에서 pos값 만큼 더한 위치의 값 pos가 0이면 파일의 끝으로 커서 위치한다. |
SEEK_SET | 파일의 커서가 처음에 있다고 가정하고 pos 값만큼 오프셋 한 위치 |
이제 예제를 한번 살펴보겠습니다.
단순한 예제입니다. 파일을 열고 그 파일의 오프셋을 설정한 후 원하는 문자열을 써주는 것입니다.
lseek()을 2번 호출하여 각각 다른 위치로 오프셋을 이동시키는데요, 처음은 SEEK_SET을 이용하여
처음 파일의 위치에서 20만큼 오프셋한 위치로, 그 다음은 파일에 끝으로 이동하여 각각 문자열을 씁니다.
위의 작성한 코드를 실행시켜 본 후 파일을 열어보죠.
처음 파일에는 "Linux System Programming lseek() system call test" 라는 문자열이
기록되어 있는데요, 프로그램을 실행한 후 다시 파일을 출력하면, 아래와 같이 출력됩니다.
파일의 처음 위치에서 20만큼 오프셋 한 곳에 문자열이 기록되며, 그 다음 파일에 끝에 문자열이
기록되는 것을 확인할 수 있습니다.
lseek() 시스템 콜을 이용하게되면, 파일의 끝을 넘어서는 위치도 오프셋이 가능합니다. 그 위치에서
데이터를 읽으면 당연히 EOF가 반환되겠지요, 당연한건가요?? 파일의 끝을 늘려준 것 뿐이라고 생각하시면
편할 겁니다.
하지만, 무제한 적으로 파일을 늘릴 수 있는 것은 아닙니다.
시스템 콜의 입력인자 중 pos의 자료형은 off_t이죠, 이 자료형도 크기가 제한되므로 무제한으로 늘릴 수
있는 것은 아니랍니다 ^^
'Linux > System Programming' 카테고리의 다른 글
[프로세스 관리] 0. 프로그램 / 프로세스 / 스레드 (0) | 2015.04.12 |
---|---|
[파일입출력] 6. 파일 안의 데이터 잘라내기 (0) | 2015.02.12 |
[파일입출력] 4. 동기식 입출력 (1) | 2015.02.04 |
[파일입출력] 3. write()로 파일에 쓰기 (2) | 2015.02.03 |
[파일입출력] 2. read()로 파일 읽기 (2) | 2015.02.01 |