免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 6330 | 回复: 6
打印 上一主题 下一主题

lseek出错返回-1和文件偏移量为-1的关系问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-11-20 00:55 |只看该作者 |倒序浏览

  1. #include <stdio.h>
  2. #include <sys/types.h>
  3. #include <unistd.h>
  4. #include <fcntl.h>
  5. #include <sys/stat.h>

  6. #define FILE_MODE (O_RDWR|O_CREAT)

  7. int main(void)
  8. {
  9.         off_t                   currpos;
  10.         int                     fd;

  11.         fd = creat("file.hole", FILE_MODE);
  12.         if(fd == -1){
  13.                 perror("creat");
  14.                 return 1;
  15.         }

  16.         currpos = lseek(fd, -1, SEEK_SET);
  17.         if(currpos == -1){
  18.                 printf("can not support lseek\n");
  19.         }
  20.         else{
  21.                 printf("support seek\n");
  22.         }

  23.         return 0;
  24. }
复制代码

APUE2中说:因为偏移量可能是负值,所以在比较lseek的返回值时,应该测试是否是-1,而不要测试是否小于0。
因为文件偏移量可以是负值,所以也可以是-1,而lseek出错也返回-1。
在本程序中偏移量currpos = = -1,是属于lseek出错呢还是属于偏移量是-1呢?

论坛徽章:
0
2 [报告]
发表于 2007-11-20 08:44 |只看该作者
这种情况是lseek出错, 因为对于普通的文件, 其偏移量必须是非负值. 而此时你让其偏移量为-1, 所以出错了, 你可以在
if(currpos == -1){
                printf("can not support lseek\n");
        }
中再加一行
perror("<lseek>");
就会报出错的原因. 现在这种情况就一般为:Invalid argument

论坛徽章:
0
3 [报告]
发表于 2007-11-20 08:48 |只看该作者

回复 #2 scutan 的帖子

明白,还是书没有看仔细!

论坛徽章:
0
4 [报告]
发表于 2007-11-21 23:10 |只看该作者

回复 #2 scutan 的帖子

什么文件才能算是普通文件呢?
if(currpos == -1){
                printf("can not support lseek\n");
        }
中加一行
perror("<lseek>");
后创建file.hole文件的时候不报:Invalid argument的错误,也就是说系统永许
像file.hole这样的文件偏移量可以为负值
创建file.c文件的时候报:Invalid argument的错误,file.c文件为普通文件

论坛徽章:
0
5 [报告]
发表于 2007-11-21 23:59 |只看该作者
原帖由 xiaozhu2007 于 2007-11-21 23:10 发表
什么文件才能算是普通文件呢?
if(currpos == -1){
                printf("can not support lseek\n");
        }
中加一行
perror("");
后创建file.hole文件的时候不报:Invalid argument的错误,也就 ...

什么文件才能算是普通文件?这个要怎么说。。UNIX/Linux并没有对普通文件有什么特定的格式要求啊。可以简单地把普通文件看成是
由一系列的字节组成,按照程序希望的方式我们可以进行读写。
lseek返回的是从文件头到文件指针被设置处的字节偏移值,失败才返回-1。

论坛徽章:
0
6 [报告]
发表于 2007-11-22 00:55 |只看该作者

回复 #5 lj_860603 的帖子

我只是疑惑file.hole与file.c的不同。
对于普通文件file.c偏移量不永许是负值,所以leek(fd, -1, SEEK_SET)返回-1
但是对于文件file.hole(只是后缀名不一样,难道代表的不是普通文件或者是什么特殊文件),leek(fd, -1, SEEK_SET)却不报错。

论坛徽章:
0
7 [报告]
发表于 2007-11-22 11:20 |只看该作者
执行lseek前将errno置零,执行lseek后读errno的值。
看是否出错。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP