linux经典程序中的问题,哪位高手帮我解释解释,谢谢

关于程序中的if((bytes_read==-1)&&(errno!=EINTR)) break;这一句我不理解,我觉得当bytes_read==-1时就应该break才对,为什么还要&&(errno!=EINTR)?? 在linux的帮助文档中查到EINTR: The call was interrupted by a signal before any data was read. 。请问这是什么意思,哪位高手帮我解释下,谢谢。 ???????????????


#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <errno.h> 

#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) 

fprintf(stderr,"Usage:%s fromfile tofile/n/a",argv[0]); 
exit(1); 


/* 打开源文件 */ 

if((from_fd=open(argv[1],O_RDONLY))==-1) 

fprintf(stderr,"Open %s Error:%s/n",argv[1],strerror(errno)); 
exit(1); 


/* 创建目的文件 */ 

if((to_fd=open(argv[2],O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR))==-1) 

fprintf(stderr,"Open %s Error:%s/n",argv[2],strerror(errno)); 
exit(1); 


/* 以下代码是一个经典的拷贝文件的代码 */ 

while(bytes_read=read(from_fd,buffer,BUFFER_SIZE)) 
{//EINTR: The call was interrupted by a signal before any data was read.
/* 一个致命的错误发生了 */ 
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_write==-1)break; // 这句能得到执行吗??????????????



close(from_fd); 
close(to_fd); 
exit(0); 

作者: zhengyixiaohei   发布时间: 2011-05-03

因为read返回-1时有可能不是系统错误,有一种情况就是read被信号中断了。

作者: keywie007   发布时间: 2011-05-03

目的应该是:信号发生时,在处理完信号之后,重新read
而不是直接报错退出

作者: justkk   发布时间: 2011-05-03