linux编程问题,这是linux编程中的一个经典程序。

请问if(bytes_write==-1)break;这句能得到执行吗,如果这句要执行的话,那么第二个while语句中的bytes_write 就为-1,while就会执行,也就是while循环不会跳出来,所以两者不是相矛盾吗?????


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

/* 一个致命的错误发生了 */ 
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

请问if(bytes_write==-1)break;这句能得到执行吗,如果这句要执行的话,那么第二个while语句中的bytes_write 就为-1,while就会执行,也就是while循环不会跳出来,所以两者不是相矛盾吗?????


if(bytes_write==-1)break;这句是可以执行,
当第二个while中
if((bytes_write==-1)&&(errno!=EINTR))break; 跳出时,
bytes_write == -1

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

if(bytes_write==-1)break;这句话是会执行的。因为当
if((bytes_write==-1)&&(errno!=EINTR))break;  
这句话执行时,如果errno不是EINTR,就会跳出内循环,执行到if(bytes_write==-1),这个时候会执行这句话,然后break,跳出外循环。
之所以这样写,是为了处理(bytes_write==-1)&&(errno!=EINTR)这种情况,当发生这种情况时,程序要跳出内外两个循环,但是break语句只能跳出内循环,所以在外循环里面再加一个判断语句,用于跳出外循环。

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