关于使用lseek()创建一个文件的学习引申——运算符优先级

来源:互联网 发布:软件功能介绍 编辑:程序博客网 时间:2024/05/21 07:08

使用lseek()创建一个文件的过程

1.open()打开一个文件

//<(6级) 的优先级大于 = (14级),所以不能写成 fd=open<0这种判断形式

        if((fd=open(argv[1],O_RDWR|O_CREAT,0777))<0){
                sys_err("open",3);// errno=3 open failed
        }
 2.lseek()扩展空文件
        if(lseek(fd,MAP_LEN-1,SEEK_SET)<0){
                sys_err("lseek",4);

        }

3.对扩展的文件执行写操作一次,才能真正扩展文件大小

        if(write(fd,"\0",1)<0){
                sys_err("write",5);
        }


在这个过程中遇到对的问题

lseek:illegal seek:报这个错误的原因一般是偏移超出内存,或者说要查找索引的文件本身是错误的

排错:

1.首先应该检查一下文件描述符fd是否是一个有效值

如果在打开文件的时候使用了 if(fd=open(filename,O_RDWR,0777)<0)这种错误的方式

为什么说这种方式是错误的?

首先把判断条件单独拿出来就是:fd=open()<0

而实际上这个式子的含义是 先判断open的返回值是否小于0,为真就返回1,为假就返回0,比如:

int a;

a= 3<5;//3小于5为真,判断式返回1,a的值最后是1

a=5<3;//5小于3 为假,判断式返回0,a的值最后是0

所以open()实际返回的文件描述符为3,而3>0,所以open()<0 整体返回的是0,这样最后导致fd=0的情况出现,而fd=0表示的是当前进程默认打开的系统标准输入文件,不能对标准输入文件设置sleek()(原因还不清楚),所以就会报错illegle seek 的错误

0 0
原创粉丝点击