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

    xiaoxiao2021-03-25  57

    使用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 的错误

    转载请注明原文地址: https://ju.6miu.com/read-39769.html

    最新回复(0)