-
NAME
lseek - reposition read/write file offset
-
SYNOPSIS
#include <sys/types.h>
#include <unistd.h>off_t lseek(int fd, off_t offset, int whence);
-
DESCRIPTION
lseek() repositions the file offset of the open file description associated with the file descriptor fd to the argument
offset according to the directive whence as follows:
SEEK_SET
The file offset is set to offset bytes.
SEEK_CUR
The file offset is set to its current location plus offset bytes.
SEEK_END
The file offset is set to the size of the file plus offset bytes.
lseek() allows the file offset to be set beyond the end of the file (but this does not change the size of the file).
If data is later written at this point, subsequent reads of the data in the gap (a "hole") return null bytes ('\0') until data is actually written into the gap.
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
int main()
{
//int fd = open("./hello.c", O_RDWR|O_CREAT);
int fd = open("./hello.c", O_RDWR|O_CREAT, 0x0777);
char wbuf[] = "hello world";
int len = write(fd, wbuf, sizeof(wbuf));
printf("len = %d\n", len);
char rb;
len = lseek(fd, 0, SEEK_SET);
printf("seek_set,offset=0, len = %d\n", len);
read(fd, &rb, 1);
printf("seek_set,offset=0, rb = %c\n", rb);
len = lseek(fd, 5, SEEK_SET);
printf("seek_set,offset=5, len = %d\n", len);
read(fd, &rb, 1);
printf("seek_set,offset=5, rb = %c\n", rb);
len = lseek(fd, 0, SEEK_CUR);
printf("seek_cur,offset=0, len= %d\n", len);
read(fd, &rb, 1);
printf("seek_cur,offset=0, rb = %c\n", rb);
len = lseek(fd, 2, SEEK_CUR);
printf("seek_cur,offset=2, len= %d\n", len);
read(fd, &rb, 1);
printf("seek_cur,offset=2, rb = %c\n", rb);
len = lseek(fd, -2, SEEK_END);
printf("seek_end,offset=-2, len= %d\n", len);
read(fd, &rb, 1);
printf("seek_end,offset=-2, rb = %c\n", rb);
len = lseek(fd, 4, SEEK_END);
printf("seek_end,offset=4, len= %d\n", len);
if((len = read(fd, &rb, 1))<0)
printf("error happen....\n");
else
printf("seek_end,offset=4, rb = %c\n", rb);
return 0;
}
- lseek Logs
len = 12
seek_set,offset=0, len = 0
seek_set,offset=0, rb = h
seek_set,offset=5, len = 5
seek_set,offset=5, rb =
seek_cur,offset=0, len= 6
seek_cur,offset=0, rb = w
seek_cur,offset=2, len= 9
seek_cur,offset=2, rb = l
seek_end,offset=-2, len= 10
seek_end,offset=-2, rb = d
seek_end,offset=4, len= 16
seek_end,offset=4, rb = d