lseek(2)

#include <sys/types.h>
#include <unistd.h>

off_t lseek(int fd, off_t offset, int whence);

read/write할 file의 위치를 이동하거나 현재 파일의 읽거나 쓰기할 위치를 얻는 함수입니다. stdio.h의 ftell함수와 같은 읽기/쓰기 위치를 얻는 system call함수는 없으며, lseek(fd, 0, SEEK_CUR);의 return 값으로 현재 위치를 얻을 수 있습니다.

    만약 파일의 크기보다 큰 위치로 이동되어도 오류가 발생하지 않으며 파일의 크기도 바뀌지 않습니다. 파일의 끝을 벗어난 곳에서 write(2)를 호출하면 그 위치에서 파일이 write가 되며, 존의 파일의 끝과 write한 곳 사이에는 0x00으로 값이 설정됩니다.

 

파라미터

fd
    - open(2) 또는 creat(2)를 통하여 얻은 file descriptor
offset
    - whence로 부터 이동할 상대 위치로 +-값을 가질 수 있으며, byte 단위의 위치입니다.
    - SEEK_SET(처음부터)인 경우는 -값을 가질 수 없으며, offset 값이 곧 이동할 위치입니다.
whence
    - offset 값의 상대 위치를 어디에서 시작할 것인지를 지정하는 값.

 SEEK_SET : 파일의 시작에서 offset 값 만큼 이동합니다. offset값이 파일의 읽기/쓰기의 위치로 지정됩니다.
  음수로 offset을 설정할 수 없습니다.
 SEEK_CUR : 현재 읽기/쓰기 위치로 기준으로 offset값을 더한 위치로 이동합니다.(offset은 +-값)
     만약 SEEK_CUR에 offset을 0으로 설정하면 파일의 현재 위치를 return 합니다.
 SEEK_END : 파일의 끝을 기준으로 offset값을 더한 위치로 이동합니다. (offset은 +-값) 

 

RETURN

0 이상
    - 변경된 파일에 대한 읽기/쓰기 위치 정보로 파일을 시작부터의 offset입니다.

-1
    - 오류가 발생하였으며, 상세오류내용은 errno 변수에 설정됩니다.

 EBADF  : fd가 유효한 file descriptor가 아님.
 EINVAL : whence가 잘못된 값이거나 whence와 offset의 조합의 결과값이 -값인 경우입니다.
 EOVERFLOW : return된 파일 읽기/쓰기 정보가 off_t type을 벗어난 값입니다.
 ESPIPE : fd가 pipe, socket, FIFO입니다.

 


활용 예제

 

Sample

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <fcntl.h>
#include <errno.h>

int main(int argc, char *argv[])
{
    int fd;
    int size;
    char buffer[4096];

    if((fd = open("sample2.txt", O_WRONLY | O_CREAT, 0644)) == -1) {
        fprintf(stderr, "ERROR: %s\n", strerror(errno));
        return 1;
    }

    lseek(fd, 0, SEEK_END);

    .......

    if((size = write(fd, buffer, strlen(buffer))) {
        fprintf(stderr, "WRITE ERROR: %s\n", strerror(errno));
        close(fd);
        return 1;
    }

    ......

    close(fd);

    return 0;
}

 


 

see also :

    File 속성 정보 및 파일 관리 Library

    Directory 정보 조회 및 관리 Library

    System Call File I/O Library

    Stream File I/O Library

 

블로그 이미지

사용자 자연&사람

행복한 개발자 programmer since 1995.

댓글을 달아 주세요