此 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)

因此,例如,如果 valueint,它可能会占用 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. 这是readwrite 在返回值方面不对称的地方:read 可以并且确实返回零。)

【讨论】:

以上是关于此 IF 语句中的语句如何工作?的主要内容,如果未能解决你的问题,请参考以下文章

将if语句与声纳中的一个括起来

简化/自动化此If语句中的分支

在 Typescript 中的 if 语句中限制赋值

if语句中的ERRORLEVEL无法正常工作[关闭]

SQL Server:此 SQL 语句如何工作

在 foreach 循环中的 if 语句中的 while 循环...无法正常工作