IF语句中的语句如何工作?

时间:2014-01-27 14:41:54

标签: c linux pipe ipc

我最近刚刚在进程间通信中开始编程教育,这段代码是在父进程代码部分编写的。根据我对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是父进程中数字的输入,然后父进程通过子进程发送给子进程,子进程对其进行某些算术运算。

任何有关该主题的澄清帮助都非常适用。

编辑:在提问时如何突出显示我的系统功能?

2 个答案:

答案 0 :(得分:5)

这也捕获了一个成功但部分写入,应用程序想要将其视为失败。

如果没有无意义的表现,它会更容易阅读:

if(write(request[WRITE], &value, sizeof value) != sizeof value)

因此,例如,如果valueint,它可能会占用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和数字之间的一些正值请求写入的字节数,包括在内。这是readwrite在返回值方面不对称的地方:read可以,并且确实返回零。)