|
|
发表于 2006-5-6 01:19:49
|
显示全部楼层
write,open或者这类的函数都可以被信号中断,但这并不代表函数本身就失败了,所以一般都用这样的形式比较好
while (((res = read(fd, buf, size)) == -1) && (errno == EINTR)) ;
if (res == -1) {
// error meets
return -1;
}
// ok, go on
这段代码只有当 read 遇到 EINTR 外的真正错误才会失败, 否则都可以正确地执行
至于 write, 它更特殊, 还要保证全部待发送的数据都被成功的发送, 就是说累加的已发送字节数等于待发送字节数
楼主那样的代码某种意义上来说并不完整. 注释中也提到, 要 call write() again 的.
errno == EINTR 就是被信号中断的情况, 这时候 write 应该返回 -1. 只有当无数据可读时才返回 0 (前提还要是没有被阻塞) |
|