C & LINUX

C / LINUX lseek()

Ocean_ 2022. 5. 1. 15:47

함수 기능

오픈된 파일의 오프셋 위치를 명시적으로 변경하는 시스템 호출

함수 원형

#include<sys/types.h>
#include<unistd.h>
off_t lseek(int filedes, off_t offset, int whence)

리턴 값 : 성공시 파일 오프셋, 에러시 -1

함수 파라메터

file des 

lseek할 파일디스크립터

offset

파일 오프셋 위치

whence

SEEK_SET - 파일의 오프셋 위치를 처음으로

SEEK_CUR - 현재 오프셋 부터 계산

SEEK_END - 파일의 오프셋은 파일 마지막

함수 예제

lseek 1

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

int main(void){
    char *fname = "ssu_test.txt";
    off_t fsize;
    int fd;

    if((fd=open(fname,O_RDONLY))<0){
        fprintf(stderr,"open error for %s\n",fname);
        exit(1);
    }
    if((fsize = lseek(fd,0,SEEK_END))<0){
        fprintf(stderr, "lseek error\n");
        exit(1);
    }

    printf("The size of <%s> is %ld bytes.\n",fname,fsize);

    exit(0);
}

lseek2

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<fcntl.h>
#include<sys/stat.h>

#define CREAT_MODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)

char buf1[] = "1234567890";
char buf2[] = "ABCDEFGHIJ";

int main(void){
    char *fname = "ssu_hole.txt";
    int fd;

    if((fd = creat(fname,CREAT_MODE))<0){
        fprintf(stderr, "creat error for %s\n",fname);
        exit(1);
    }
    
    if(write(fd,buf1,12)!=12){
        fprintf(stderr,"buf1 write error\n");
        exit(1);
    }
    if(lseek(fd,15000,SEEK_SET)<0){
        fprintf(stderr,"lseek error\n");
    }

    if(write(fd,buf2,12)!= 12){
        fprintf(stderr, "buf2 write error\n");
        exit(1);
    }
    exit(0);
}

함수 결과

lseek1

lseek2

 

리눅스시스템 프로그래밍 - 홍지만 저

교재 내에 있는 예제를 바탕으로 작성한 글 입니다.