C言語システムコール-lseek

lseekシステムコール

概要

lseekはファイルオフセット(読み書き位置)を指定位置に移動します。

ファイルの読み書き処理において、ファイルの先頭ではなく、指定の開始場所までシーク(移動)してから読み書きを行う場合にlseekを使用します。


openされたファイル(ファイルディスクリプタ)は、ファイルの読み書き位置を示すファイルオフセットを保持しています。

ファイルオフセットはreadやwriteなどのシステムコールを実行すると、処理したバイト数分が自動的に加算されます。

lseekを使用することで、ファイルの一部分を読み飛ばしたり、処理位置を巻き戻すといったことが可能になります。


ファイルオフセットは「ファイルポジションポインタ」とも呼ばれます。

ファイルオフセットはforkしたプロセス間や、dupなどで複製したファイルディスクリプタで共有されます。


サンプルプログラム


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

static int
read_data_part(int fd)
{
    off_t offset = {0};
    ssize_t num = 0;
    char buf[4096] = {"\0"};

    /* 先頭64Bytesを読みとばす */
    offset = lseek(fd, 64, SEEK_SET);
    if(offset < 0){
        printf("Error: lseek(%d) %s\n", errno, strerror(errno));
        return(-1);
    }

    num = read(fd, buf, sizeof(buf));
    if(num < 0){
        printf("Error: read(%d) %s\n", errno, strerror(errno));
        return(-1);
    }

    /* debug */
    write(1, buf, num);

    return(0);
}

int
main(void)
{
    int fd = 0;
    int rc = 0;
    char *path = "./tmp/datatable.txt";

    fd = open(path, O_RDONLY);
    if(fd < 0){
        printf("Error: open(%d) %s\n", errno, strerror(errno));
        return(-1);
    }

    rc = read_data_part(fd);
    if(close(fd) < 0){
        printf("Error: close(%d) %s\n", errno, strerror(errno));
        return(-1);
    }

    return(rc);
}


関連ページ