例如,我想从一个孩子到父母获得一个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个部分.查看已接受答案的评论.
read并write使用字节,而不是消息。有关它们与管道的行为方式的详细信息,请参阅 POSIX 中的文档:
在你的代码中,我认为read 应该总是得到 4 个整数,因为:
成功完成后,如果 nbyte 大于 0,read() 将标记更新文件的最后数据访问时间戳,并返回读取的字节数。该数字绝不能大于 nbyte。如果文件中剩余的字节数小于 nbyte,如果 read() 请求被信号中断,或者如果文件是管道、FIFO 或特殊文件并且少于 nbyte,则返回的值可能小于 nbyte nbyte 字节立即可供读取。例如,来自与终端关联的文件的 read() 可能会返回一行键入的数据。
始终有 4 个整数可供读取,因为4*sizeof(int) < PIPE_BUF这种大小的写入是原子的。
当被信号中断时返回短读取的允许可能read会发挥作用,但是当有足够多的字节立即可用时,这应该不会发生(至少在现实世界中)。