当前位置: 技术问答>linux和unix
linux编程问题,这是linux编程中的一个经典程序。
来源: 互联网 发布时间:2016-11-26
本文导语: 请问if(bytes_write==-1)break;这句能得到执行吗,如果这句要执行的话,那么第二个while语句中的bytes_write 就为-1,while就会执行,也就是while循环不会跳出来,所以两者不是相矛盾吗????? #include #include #include #i...
请问if(bytes_write==-1)break;这句能得到执行吗,如果这句要执行的话,那么第二个while语句中的bytes_write 就为-1,while就会执行,也就是while循环不会跳出来,所以两者不是相矛盾吗?????
#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)
{
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);
}
#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)
{
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);
}
|
请问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
if(bytes_write==-1)break;这句是可以执行,
当第二个while中
if((bytes_write==-1)&&(errno!=EINTR))break; 跳出时,
bytes_write == -1
|
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语句只能跳出内循环,所以在外循环里面再加一个判断语句,用于跳出外循环。
if((bytes_write==-1)&&(errno!=EINTR))break;
这句话执行时,如果errno不是EINTR,就会跳出内循环,执行到if(bytes_write==-1),这个时候会执行这句话,然后break,跳出外循环。
之所以这样写,是为了处理(bytes_write==-1)&&(errno!=EINTR)这种情况,当发生这种情况时,程序要跳出内外两个循环,但是break语句只能跳出内循环,所以在外循环里面再加一个判断语句,用于跳出外循环。