该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
先上代码 ,这个代码是经典的文件拷贝代码。
#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?