Nicle wrote: > Hi all, > > I have a file > 2GB, and my job is seeking the file to pos: 2.1G. > But, it seems that the lseek64 doesn't work. > Here is the sample code: > > #define _LARGEFILE64_SOURCE > #include ... > > int main() > { > int fd = -1; > long long pos = (long long) 2*1024*1024*1024 + 10; // over 2G > > fd = open(FILENAME, O_WRONLY|O_LARGEFILE); > if (fd < 0){ > ... > } > > if (lseek64(fd, pos, SEEK_SET) < 0) { > fprintf(stderr, "Failed seeking to %lld, %s\n", pos, strerror(errno)); > } > > return 0; > } > > Then the building cmd: > gcc -o test test.c -D_FILE_OFFSET_BITS=64 > > Output: > Failed seeking to 2147483658, Success. > > The return val of lseek64 was "<0", but the strerror told me "Success". > -- > To unsubscribe from this list: send the line "unsubscribe linux-c-programming" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html > > I changed the below a little, but when I seeked to 2.1GB, it worked fine. I am not writing like you, but reading. #define _LARGEFILE64_SOURCE #include <stdio.h> #include <sys/types.h> #include <unistd.h> #include <stdlib.h> #include <errno.h> #include <string.h> #include <sys/stat.h> #include <fcntl.h> int main() { int fd, ret; size_t count = 200; long long pos = (long long) 2*1024*1024*1024 + 10; // over 2G char buf[count]; fd = open("/tmp/fish", O_RDONLY|O_LARGEFILE); if (fd < 0){ fprintf(stderr, "%s\n", strerror(errno)); exit(1); } if (lseek64(fd, pos, SEEK_SET) < 0) { fprintf(stderr, "Failed seeking to %lld, %s\n", pos, strerror(errno)); exit(1); } if ((ret = read(fd, buf, count)) < 0) { fprintf(stderr, "Failed reading: %s\n", strerror(errno)); exit(1); } buf[ret] = 0x00; printf("%s\n", buf); close(fd); return 0; } -- To unsubscribe from this list: send the line "unsubscribe linux-c-programming" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html