我最近刚刚在进程间通信中开始编程教育,这段代码是在父进程代码部分编写的。根据我对write()
的了解,如果失败则返回-1
,如果没有写入0
则返回pipe()
,如果成功则返回正整数。 sizeof(value)
究竟是如何帮助我们识别出来的?与if(write(request[WRITE],&value,sizeof(value) < 1)
。
sizeof(value)
不是更友好的替代品
if(sizeof(value)!=write(request[WRITE],&value,sizeof(value)))
{
perror("Cannot write thru pipe.\n");
return 1;
}
代码说明:变量value
是父进程中数字的输入,然后父进程通过子进程发送给子进程,子进程对其进行某些算术运算。
任何有关该主题的澄清帮助都非常适用。
编辑:在提问时如何突出显示我的系统功能?
答案 0 :(得分:5)
这也捕获了一个成功但部分写入,应用程序想要将其视为失败。
如果没有无意义的表现,它会更容易阅读:
if(write(request[WRITE], &value, sizeof value) != sizeof value)
因此,例如,如果value
是int
,它可能会占用4个字节,但如果write()
只写了其中2个,那么它将返回2
被这个测试捕获。
至少在我看来。请记住sizeof
不是函数。
答案 1 :(得分:0)
那不是read
,而是write
。原理几乎相同,但有一点扭曲。
作为一般规则,您是正确的:write()
可以返回“短计数”,表示部分写入。例如,您可能要求将2000字节写入某个文件描述符,write
可能会返回类似1024的值,表示976(2000 - 1024)字节不写入但没有发生了实际错误。 (例如,当在像tty或pty这样的“慢”设备上写入时接收信号时会出现这种情况。当然,应用程序必须决定如何处理部分写入:它应该认为这是一个错误吗?它应该重试吗?剩余的字节?将write
包装在一个循环中是很常见的,在短计数的情况下重试剩余的字节;例如,stdio fwrite
代码执行此操作。)
然而,对于管道,有一个特例:writes of sufficiently small size (less than or equal to PIPE_BUF
) are atomic。所以假设 sizeof(value) <= PIPE_BUF
,并且这确实是在管道上写的,这段代码是正确的:write
将返回sizeof(value)
或-1
。
(如果sizeof(value)
为1,代码是正确的 - 虽然误导 - 对于任何描述符:write永远不会返回零。唯一可能的返回值是-1
和1和数字之间的一些正值请求写入的字节数,包括在内。这是read
和write
在返回值方面不对称的地方:read
可以,并且确实返回零。)