使用 pipe() 时,子进程如何向父进程返回两个值?

Posted

技术标签:

【中文标题】使用 pipe() 时,子进程如何向父进程返回两个值?【英文标题】:How can a child process return two values to the parent when using pipe()? 【发布时间】:2011-09-28 03:19:00 【问题描述】:

我让我的子进程计算文本文件中单词的频率。我正在为 IPC 使用pipe()。子进程如何将词名和词频同时返回给父进程?我的源代码是 C 语言,我在 UNIX 环境中执行它。

【问题讨论】:

到目前为止你尝试过什么?您是否有任何无法使用的代码? 你知道如何创建管道吗?你知道怎么寄东西吗? 【参考方案1】:

将这两个值写入子管道的一端,用分隔符分隔。在父级中,从管道的另一端读取,并使用分隔符分隔内容。

【讨论】:

明智的做法是使用换行符来分隔记录,并使用空格将单词与与单词相关的计数分开 - 换句话说,使用诸如'paranormality 23 这样的文本表示'。 分隔符无关紧要;换行符与任何其他分隔符一样好,但是,在所有条件相同的情况下,换行符是一个不错的选择。【参考方案2】:

写入到PIPE_BUF 大小的管道是原子的(包含在limits.h 中),因此您可以轻松地将您的信息打包到某种类型的结构中,并将其写入您子进程中的管道中父进程读取。例如,您可以将结构设置为:

struct message

    int word_freq;
    char word[256];
;

然后只需使用等于sizeof(struct message) 的缓冲区从管道中读取。话虽如此,请记住,最好只有一个读取器/写入器连接到管道,或者您可以有多个写入器(因为写入是原子的),但同样只有一个读取器。虽然可以使用管道管理多个读取器,但读取不是原子的事实意味着您最终可能会遇到由于进程调度的不确定性而丢失消息的情况,或者您得到乱码消息,因为进程未完成读取并将部分消息留在管道中。

【讨论】:

以上是关于使用 pipe() 时,子进程如何向父进程返回两个值?的主要内容,如果未能解决你的问题,请参考以下文章

pipe_wait问题_转

通过 npm 脚本生成时从子进程向父进程发送消息

linux下fork两子进程为啥只有一个读取到pipe的内容?

python子进程模块subprocess详解与应用实例 之二

如何在父进程和子进程之间发送带有 pipe() 的矩阵?

C#/.NET:向父服务报告子进程状态