if((bytes_write==-1)&&(errno!=EINTR))break; else if(bytes_write==bytes_read)break; else if(bytes_write>0){ptr=ptr+bytes_write;bytes_read=bytes_read-bytes_write;}先分析一下错误代码:如果write()失败,返回-1,错误代码存入errno.EINTR:此调用被信号所中断。EAGAIN:当使用不可阻断I/O 时(O_NONBLOCK),若无数据可读取则返回此值。EBADF: 参数fd非有效的文件描述词,或该文件已关闭第一个判断中指明了 "&&(errno!=EINTR)" 也就是说如果因为EINTR而停止写入,循环不退出.这时写入的字节数bytes_write <= bytes_read,进入第二/三个判断. ptr指向尚未写入的剩余数据首地址,pytes_read重新赋值为剩余数据大小,继续写.如此循环直到读到的数据全部写入为止.
|