Linux下errno_t未定义,关于errno!=EINTR(求助各位网友)

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

先上代码 ,这个代码是经典的文件拷贝代码。

#include

#include

#include

#include

#include

#include

#include

#define BUFFER_SIZE 1024

int main(int argc,char *argv[]){

int from_fd,to_fd;

int bytes_read,bytes_write;

char buffer[BUFFER_SIZE];

char *ptr;

if(argc<3){

perror("Please input at least 2 file names\n");

exit(1);

}

if((from_fd=open(argv[1],O_RDONLY))<0){

printf("can't read %s \n",argv[1]);

}

if((to_fd=open(argv[2],O_WRONLY|O_CREAT,755))<0){

printf("can't create or write %s\n",argv[2]);

}

while(bytes_read=read(from_fd,buffer,BUFFER_SIZE)){

if((bytes_read==-1)&&(errno!=EINTR)) break;

else if (bytes_read>0){

ptr=buffer;

while(bytes_write=write(to_fd,ptr,bytes_read)){

if((bytes_write==-1)&&(errno!=EINTR)) break;

else if(bytes_write==bytes_read) break;

else if(bytes_write>0){

ptr+=bytes_write;

bytes_read-=bytes_write;

}

}

}

}

}

我的问题是:if((bytes_read==-1)&&(errno!=EINTR)) break;这条判断语句,我知道这条语句是读错误就跳出while循环不再读。但是有点不明白为什么是与上(errno!=EINTR)。众所周知。若read()函数失败会返回-1,此时由于不是中断产生的返回,故errno!=EINTR也是成立的,两者相与的话 结果为真,能正常跳出while循环。这个没有问题

但是若是因为中断原因导致read函数返回时,则read函数不仅会返回-1且会将errno==ENITR,这样的话 第一条判断语句则为真,而第二条就变成假了,两者再相与还是为假。这样就不会执行break去跳出循环,而是接着往下执行了。这样执行还有意义么?

另外为什么不直接if(byte_read==-1) break;这一条语句不就够了么?为什么还要errno!=ENITR?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值