关于 lseek 函数的一个疑问

呼噜呼噜睡翻天 发布于 2013/05/09 00:06
阅读 265
收藏 1

在《UNIX环境高级编程》的第3.6节中有这样一段话:

    通常,文件的偏移量应当是一个非负整数,但是,某些设备也可能允许负的偏移量。
但对于普通文件,则其偏移量必须是非负值。因为偏移量可能是负值,所以在比较lseek的返回值时应当谨慎,不要测试它是否小于0, 而要测试它是否等于-1.

现在假设有一个设备的偏移量允许为负值,当调用 lseek(fd, 0, SEEK_CUR) ,它的返回值是 -1 。

此时的-1,是说明lseek函数调用失败,还是它的当前文件偏移量就是-1???

加载中
0
hikari
hikari

我被你的问题吸引了,很久没在这回答问题,你想得很深入,这种素质很好

刚复习了一下自己收藏的文档,原文如下:

Normally, a file's current offset must be a non-negative integer. It is possible, however, that certain devices could allow negative offsets. But for regular files, the offset must be non-negative. Because negative offsets are possible, we should be careful to compare the return value fromlseekas being equal to or not equal to 1 and not test if it's less than 0.

The /dev/kmem device on FreeBSD for the Intel x86 processor supports negative offsets.

我的理解是:Unix下文件系统的文件是不会出现你说的情况,但如果用于例如/dev/kmem的那种内存情况,-1应该也是正确的,不过如果继续钻一下牛角尖,此时的/dev/kmem在什么情况下的lseek才会表示错误呢?还没用到那种情况,我猜测也许是类似exception之类的情况,也许类似Windows下访问了不能访问的内存时候的异常。

0
呼噜呼噜睡翻天
呼噜呼噜睡翻天

引用来自“hikari”的答案

我被你的问题吸引了,很久没在这回答问题,你想得很深入,这种素质很好

刚复习了一下自己收藏的文档,原文如下:

Normally, a file's current offset must be a non-negative integer. It is possible, however, that certain devices could allow negative offsets. But for regular files, the offset must be non-negative. Because negative offsets are possible, we should be careful to compare the return value fromlseekas being equal to or not equal to 1 and not test if it's less than 0.

The /dev/kmem device on FreeBSD for the Intel x86 processor supports negative offsets.

我的理解是:Unix下文件系统的文件是不会出现你说的情况,但如果用于例如/dev/kmem的那种内存情况,-1应该也是正确的,不过如果继续钻一下牛角尖,此时的/dev/kmem在什么情况下的lseek才会表示错误呢?还没用到那种情况,我猜测也许是类似exception之类的情况,也许类似Windows下访问了不能访问的内存时候的异常。

在lseek函数出错时,不光会返回-1,同时还会设置错误标志

我想在得到-1这个返回值时,再去测试一下errno就可以了;

当然,在调用lseek函数之前需要清理一下errno,不要被前面的代码影响

不知道我这样想对不对??

返回顶部
顶部