关于lseek()设置偏移量超文件开头及SEEK_END参数的疑问
lseek() 相关问题解答
1. 将偏移量设置到文件开头之前的行为
当尝试把文件偏移量设置到文件开头之前(最终偏移量小于0)时,lseek()会直接返回-1,同时将errno设为EINVAL(非法参数错误),该操作不会生效。
2. 当前偏移量为5时调用lseek(fd, 10, SEEK_END)的结果
lseek()的SEEK_END基准是当前文件的实际末尾位置,和当前的文件偏移量无关。假设当前文件大小为S,调用该函数后,新的文件偏移量会被设置为S + 10,函数返回值就是这个新的偏移量数值,不会触发错误。
举个实例:如果当前文件大小是20字节,不管当前偏移量是5还是其他值,调用后偏移量会变成30,函数返回30。
3. 新文件写入5字节后调用lseek(fd, 10, SEEK_END)的结果
创建新文件并写入5字节后,文件大小为5字节,此时SEEK_END对应的位置是5。调用lseek(fd, 10, SEEK_END)会将偏移量设置为5 + 10 = 15,函数返回15,不会触发错误,也不会返回0。
补充:如果后续在这个偏移量位置写入数据,文件中间(5到14字节的区间)会被自动填充为0,这是Linux文件系统支持稀疏文件的特性。
内容的提问来源于stack exchange,提问作者user19605052
相关产品推荐
相关产品推荐

