LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1379|回复: 7

write 函数返回0代表什么?

[复制链接]
发表于 2006-5-3 22:26:13 | 显示全部楼层 |阅读模式
当调用write函数时,它的返回值有可能是0,这代表什么?谢谢!
 楼主| 发表于 2006-5-4 08:41:05 | 显示全部楼层
write可以返回0吧?
回复 支持 反对

使用道具 举报

发表于 2006-5-4 09:38:25 | 显示全部楼层
"zero indicates nothing was written"

read the man page!!!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-5-4 15:18:50 | 显示全部楼层
我的man不能查看函数,显示的是no entry。。。好像是。
回复 支持 反对

使用道具 举报

发表于 2006-5-4 19:28:59 | 显示全部楼层
那可能是你没有安装开发文档
回复 支持 反对

使用道具 举报

发表于 2006-5-4 19:54:31 | 显示全部楼层
就算是没有 man page, 看头文件也是可以找到答案的.
我的 /usr/include/unistd.h 中对 write 函数的注释是这样的:
Return the number written, or -1
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-5-5 20:09:31 | 显示全部楼层
write 返回0是被信号中断的?

if ( (nwritten = write(fd, ptr, nleft)) <= 0)
{
                        if (errno == EINTR)
                                nwritten = 0;           /* and call write() again */
                        else
                                return(-1);                     /* error */
}

帮我看看这段代码。谢谢!
回复 支持 反对

使用道具 举报

发表于 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 (前提还要是没有被阻塞)
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表