当使用unix管道(在C中)时,操作系统是否使用read()平衡每个write()还是平衡总字节数?

Dmi*_*tri 5 c unix pipe

例如,我想从一个孩子到父母获得一个4个整数的数组.家长电话

read(apipe, buf, sizeof(int)*4);
Run Code Online (Sandbox Code Playgroud)

孩子的电话

for(int i=0; i<4;i++)
    write(bpipe, &array[i], sizeof(int));
Run Code Online (Sandbox Code Playgroud)

这样做我打算做什么(给父母4个整数)或父母只是得到第一个整数?

我尝试在其他地方寻找这个答案,但要么我不知道如何搜索,或者这太过于微妙(或者另一方面看似太明显),因此文学要详述.

编辑:为了进一步澄清,我试图写一个4部分的消息,并在一个read()中读取所有4个部分.查看已接受答案的评论.

R..*_*R.. 2

readwrite使用字节,而不是消息。有关它们与管道的行为方式的详细信息,请参阅 POSIX 中的文档:

在你的代码中,我认为read 应该总是得到 4 个整数,因为:

成功完成后,如果 nbyte 大于 0,read() 将标记更新文件的最后数据访问时间戳,并返回读取的字节数。该数字绝不能大于 nbyte。如果文件中剩余的字节数小于 nbyte,如果 read() 请求被信号中断,或者如果文件是管道、FIFO 或特殊文件并且少于 nbyte,则返回的值可能小于 nbyte nbyte 字节立即可供读取。例如,来自与终端关联的文件的 read() 可能会返回一行键入的数据。

始终有 4 个整数可供读取,因为4*sizeof(int) < PIPE_BUF这种大小的写入是原子的。

当被信号中断时返回短读取的允许可能read会发挥作用,但是当有足够多的字节立即可用时,这应该不会发生(至少在现实世界中)。

  • 有四个单独的写调用;发出读取时它们可能并不完整,在这种情况下,读取将返回可用的数据。每次写入本身都是原子的;毫无疑问,从“sizeof(int)”写入之一获取 4 个字节中的 3 个字节(假设“sizeof(int)”为 4)。但是,如果(意思是“何时”)时间完全错误,则不能保证单个“read()”中的所有“4*sizeof(int)”。 (2认同)