此 IF 语句中的语句如何工作?
Posted
技术标签:
【中文标题】此 IF 语句中的语句如何工作?【英文标题】:How does the statements inside this IF statement work? 【发布时间】:2014-01-27 14:41:53 【问题描述】:我最近刚开始在进程间通信中进行编程教育,这段代码是在父进程代码部分中编写的。从我所读到的关于write()
的内容中,如果失败,它会返回-1
,如果没有写入pipe()
,则返回0
,如果成功则返回正整数。 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
是父进程中一个数字的输入,然后父进程通过管道将其发送给子进程,子进程对其进行一些算术运算。
非常感谢任何关于该主题的澄清帮助。
编辑:提问时如何在此处突出显示我的系统功能?
【问题讨论】:
重新编辑:请参阅***.com/editing-help 了解降价说明。 【参考方案1】:这也捕获了成功但部分的写入,应用程序希望将其视为失败。
没有无意义的括号会更容易阅读:
if(write(request[WRITE], &value, sizeof value) != sizeof value)
因此,例如,如果 value
是 int
,它可能会占用 4 个字节,但如果 write()
只写入其中的 2 个字节,它将返回 2
,此测试将捕获该信息。
至少在我看来。请记住,sizeof
不是函数。
【讨论】:
【参考方案2】:那不是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 和请求的字节数之间的某个正值 - to-write, inclusive. 这是read
和write
在返回值方面不对称的地方:read
可以并且确实返回零。)
【讨论】:
以上是关于此 IF 语句中的语句如何工作?的主要内容,如果未能解决你的问题,请参考以下文章