是否可以在由同一父进程创建的两个子进程之间建立管道(LINUX,POSIX)

2024-04-24

我有多个孩子由同一个父母“分叉”,我尝试构建pipe所有这些子进程之间的连接就像一个链表结构。孩子 1 向孩子 2 发送数据,孩子 2 向孩子 3 .... 孩子 N 向孩子 1 发送数据。有没有正确的方法可以做到这一点?

此外,如果我在进程之间创建和通信,我如何强制父进程“等待”所有进程完成其工作,因为wait() or waitpid()等待第一个完成的进程,但我需要等待所有进程。这是出现的另一个问题。

谢谢...


如果构建重定向链,这本质上就是 shell 所做的事情,即类似于

ls | grep foo | sort | uniq

有一些关于Unix编程的优秀介绍文本,其中通过书中实现了一个简单的shell。 shell 的任务之一就是重定向。其中一本是 Michael K. Johnson 和 Erik W. Troan 所著的《Linux 应用程序编程》。

本书的主页:http://ladweb.net/ http://ladweb.net/

要为 N 个进程构建重定向链,您需要 N-1 个管道。对于每个重定向,您使用以下命令创建一个管道pipe(int fds[2])系统调用。后fork()ing,但之前execving use dup2(int from, int to)将管道的末端“连接”到每个进程的标准输入 (0) 或标准输出。这是一个过于简化的代码,没有错误检查:

int pipe_A[2];
int pipe_B[2];

pipe(pipe_A);
pipe(pipe_B);

pid_t pid_A, pid_B, pid_C;

if( !(pid_A = fork()) ) {
    dup2(pipe_A[1], 1); /* redirect standard output to pipe_A write end */
    execv(...);
}

if( !(pid_B = fork()) ) {
    dup2(pipe_A[0], 0); /* redirect standard input to pipe_A read end */
    dup2(pipe_B[1], 1); /* redirect standard output to pipe_B write end */
    execv(...);
}

if( !(pid_C = fork()) ) {
    dup2(pipe_B[0], 0); /* redirect standard input to pipe_B read end */
    execv(...);
}

请注意,管道的数组索引的选择方式反映了标准输入/输出文件描述符(如果它们用于 stdio 重定向)。这个选择并不是任意的。

当然,您可以将管道连接到任何文件描述符(例如,有一些应用程序期望其父级打开,例如连接到管道的 fd 3 和 4),并且大多数 shell 也直接支持这一点(例如 1>&3 将重定向标准输出到 fd 3)。然而数组索引pipe(int fds[2])当然是0和1。我只是这么说,因为我有一些货物崇拜编程的学生,他们无意中也将目标 fd 也用于管道系统调用数组。

等待所有孩子使用完毕waitpid(-1, NULL, 0)– 我认为这就是我预先回答者的意思,这意味着:等待所有子进程完成。另一种选择是打电话wait()在一个循环中,它将返回刚刚终止的子进程的 pid。如果再次调用并且仍然有一个孩子在运行,它将再次阻塞。如果没有孩子,则返回-1;我更喜欢waitpid解决方案。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否可以在由同一父进程创建的两个子进程之间建立管道(LINUX,POSIX) 的相关文章

  • 使用 gcc 的中间 GIMPLE 格式

    根据本文 http en wikipedia org wiki Intermediate languagegcc 在生成代码之前使用多种中间格式 我读到 GIMPLE 格式使用三个地址代码 这似乎是最容易使用的中间语言 但我需要更多细节 因
  • 不带()的sizeof有什么作用? [复制]

    这个问题在这里已经有答案了 作者是这个问题 https stackoverflow com questions 18898410 2 dimensional array simple understanding当我问他什么时 他只是取笑我s
  • 从汇编程序获取命令行参数

    通读 专业汇编语言书籍 似乎它提供了用于读取命令行参数的错误代码 我纠正了一点 现在它从段错误变成了读取参数计数 然后是段错误 这是完整的代码 data output1 asciz There are d params n output2
  • 类似于 Active Directory 中的搜索

    我正在使用 C 中的以下代码搜索 LDAP 以轮询用户的活动目录 DirectoryEntry entry new DirectoryEntry ldapPath userName password DirectorySearcher Se
  • OpenGL 着色器不与着色器程序链接

    我正在尝试使用 GLFW GLEW 添加着色器 我收到一个错误 指出着色器已加载 但它们没有有效的对象代码 这是我用于加载着色器的代码 class SHADER public void LoadShaders const char vert
  • 如何检查特定作业是否在quartz调度程序中运行#

    我正在使用石英调度程序根据触发器的用户输入来安排写入文件的作业 我想检查作业是否仍在 stop 方法中运行 如何检查作业是否仍在运行 public class JobScheduler static StdSchedulerFactory
  • web请求超时处理?

    HttpWebRequest request HttpWebRequest WebRequest Create url request Timeout 20000 using WebResponse response request Get
  • Control.Invoke 在隐藏的 ShowDialog 中“卡住”

    我有解决这个问题的方法 但这不是我第一次被咬 所以我试图确切地了解发生了什么 从我的申请中 我ShowDialog表单 表单上有一个按钮 单击该按钮时会调用另一个 非 GUI 线程上的代码 非 GUI 线程发回状态 Pushed then
  • 更改 RabbitMQ 队列中的参数

    我有一个 RabbitMQ 队列 最初声明如下 var result channel QueueDeclare NewQueue true false false null 我正在尝试添加死信交换 因此我将代码更改为 channel Exc
  • 如何测试抽象类的受保护抽象方法?

    我一直在研究测试名为的抽象类的最佳方法TabsActionFilter 我保证继承自的类TabsActionFilter将有一个名为GetCustomer 在实践中 这种设计似乎效果很好 我遇到的一些问题是弄清楚如何测试OnActionEx
  • 私有方法和属性的 JetBrains Rider C# 命名风格

    我想将私有方法的首字母设为小写 将公共方法的首字母设为大写 然而 在 Rider 中 C 命名风格下似乎只有一个选项可以应用所有方法 属性和事件 告诉 Rider 仅对私人使用不同约定的最佳方式是什么 也可以看看 私有方法和属性的 ReSh
  • 结构体前向声明编译失败

    我有以下代码 但编译器说 sender wrapper 未定义 即使我向前声明了它 我不能对结构进行前向声明吗 用VS2003编译 struct send wrapper struct IPSend IPSend IPSend const
  • DISM.exe 返回代码?

    我有一个程序调用 dism exe 程序 它在后台运行一些命令 现在 我只检查返回代码 0 或其他任何内容 以显示进程失败或成功 我可以用什么来交叉检查返回代码以获得准确的返回错误 DISM 参考了哪些回报 评论中提供的链接DISMAPI
  • 使用事件处理程序与覆盖事件触发方法

    我正在创建 Button 的子类 并希望向其某些事件 例如 OnClick 添加自定义功能 哪种方式更理想 我是否重写 OnClick protected override void OnClick EventArgs e base OnC
  • 执行按钮单击时使 wpf UI 响应

    在我的 wpf c 应用程序中 当用户按下按钮时会执行一个很长的过程 当按下按钮直到执行完整的代码时 窗口将冻结 用户无法在窗口中执行任何其他任务 如何使按钮单击代码作为后台进程 以便窗口响应用户 我尝试过以下方法 但没有成功 privat
  • 虚拟继承 - 跳过构造函数

    我有以下课程 class Socket Socket Socket SOCKET s class Connection public virtual Socket Connection IP ip 这两个类包含一些纯虚函数和一些非虚函数以及
  • 检测 Windows 重新启动是否是由于 Windows 更新造成的

    我的电脑上的一些应用程序一直在检测 Windows 更新是否重新启动 这是可以观察到的 因为它们会在 Windows 更新自动重启后重新启动 这非常有帮助 因为这些应用程序会重新加载更改 甚至unsaved更改或恢复选项卡 如果是浏览器 执
  • exit() 和 abort() 有什么区别?

    在C和C 中 有什么区别exit and abort 我试图在发生错误 不是例外 后结束我的程序 abort http en cppreference com w c program abort退出程序而不调用使用注册的函数atexit h
  • .NET Web API - 添加日志记录

    我正在寻找有关处理 API 日志记录的最佳方法的帮助 我想将所有请求和响应记录到 sql 或文本文件 如果这是最好的方法 目前我已经在 SQL Server 的日志表中插入一行 我使用名为 LogAction 的静态方法来执行此操作 并在
  • 在 C# 中调用并排显示窗口

    愚蠢的问题是否有一种简单的方法可以清除桌面 然后打开两个资源管理器窗口并调用 并排显示窗口 任务栏调用 只是想知道 MS 库中是否有 api 可以做到这一点 您可以使用TileWindowsWinAPI 函数通过 p invoke 将所需窗

随机推荐

  • Firefox:drawImage(视频)失败并显示 NS_ERROR_NOT_AVAILABLE:组件不可用

    尝试打电话drawImage with a video其来源是网络摄像头源似乎在 Firefox 中失败了NS ERROR NOT AVAILABLE Component is not available 我尝试等待视频标签触发的每个事件
  • 静态访问 Android 应用程序的资源?

    我有一个问题 Android 应用程序的资源 我的应用程序有杂项 模式 编辑 计划 执行 我想使用枚举类型来描述 但是 我想用源自资源 string xml 文件的字符串填充枚举值 即而不是 enum Mode EDIT edit PLAN
  • Cookie 中缺少安全属性:WL_PERSISTENT_COOKIE 和 testcookie

    在安全扫描结果中 我收到以下错误 WL PERSISTENT COOKIE 和 testcookie 的 加密会话 SSL Cookie 中缺少安全属性 我不知道如何为这些 cookie 设置安全属性 从 websphere 服务器它只允许
  • 枚举DataFlow脚本组件中的RecordSet作为数据源

    这是一个 SSIS 相关问题 我有一个设置为对象类型的变量 一个数据流将一些过滤的行导入到记录集中 并且该记录集存储在对象变量中 在完全独立的数据流中 我需要使用该记录集作为源 所以我创建了一个脚本组件并告诉它它将是一个数据源 我将其设置为
  • 将本地脚本文件添加到 EJS 视图

    我有一个 Node Express EJS 应用程序 它有一个用于视图的文件夹和另一个用于客户端文件的文件夹 后者有另一个 javascript 文件夹 其中有一个名为 frontend js 的文件 我想在此视图中加载 jQuery 和
  • 从 32 位拖放到 64 位

    我正在编写一个接受文件拖放的 C 程序 当它以 32 位编译时 它在任何情况下都可以工作 但当它以 64 位编译时 它仅适用于从 64 位应用程序拖动的文件 32 位 gt 32 位 成功 64 位 gt 64 位 成功 64 位 gt 3
  • 将命令发送到 GNU 屏幕

    我有一个名为 demo 的 GNU 屏幕 我想向它发送命令 我该怎么做呢 screen S demo X home aa scripts outputs sh yeilds No screen session found 和做screen
  • 如何判断一个类是否有成员变量?

    Problem 我想检测一个类是否有成员变量 如果有 则静态断言失败 就像是 struct b int a static assert has member variables b Class should not contain memb
  • 自定义 DataGridView 每次构建时都会添加列

    我正在写一个继承DataGridView控制默认情况下有两列 DGV 依靠用户控制GeneralTabPanel它继承自MainTabPanel它继承自UserControl 原因是MainTabPanel包含每个继承面板都必须重写的虚拟函
  • 关键“users_email_unique”空字段的重复条目“”

    我有两种类型的用户 真实的和假的 假用户是不使用系统的员工 真实用户使用他们的电子邮件地址登录 所以我的用户迁移有 table gt string email gt unique 问题是假用户可能没有电子邮件地址 我可以添加第一个假用户 没
  • Visual Studio 找不到引用

    我正在处理另一个人移交的一些应用程序 我必须在其中记录需求 构建和部署流程 这里的问题是 Visual Studio 2005 抛出很多错误 因为它找不到 dll 的引用 这显然不会让 VS 构建该项目 在该人的计算机上一切正常 但在我的计
  • 使用 Django 进行 Jquery 自动完成

    我正在尝试在 django 应用程序中使用 jquery ui 自动完成功能搜索一些项目 我看过这个question https stackoverflow com questions 4920031 jquery autocomplete
  • Java应用程序cpu负载过高的解决办法

    今天 我发现我的服务器的cpu负载太高 并且服务器只运行一个Java应用程序 下面是我的操作步骤 I used top命令查找应用程序的 pid pid是25713 I used top H p 25713命令查找一些使用最多 cpu 的
  • 将 PNG 图像中的透明度替换为白色背景

    我有一个带有 Alpha 通道 即透明度 的 PNG 图像 我需要创建将图像层合成到白色背景上的版本 我想使用可编写脚本的命令 使用 CLI 工具 例如 Image Magick 将 PNG 直接无损地转换为 PNG 导致错误的非工作 Im
  • 命令行 Ruby 函数的手册页

    有没有办法从命令行获取 Ruby 函数的手册 像 funcR 中的手册页 The ri工具在这里可能会有所帮助 http rubylearning com satishtalim ruby ri tool html ri Array ri
  • 如何使用 CPANPLUS 自动捆绑包更新新版本的 Perl?

    我有 Perl 5 13 4 其中包含大量已安装的 CPAN 模块 我刚刚编译了 Perl 5 14 0 我想将 5 13 4 中的所有模块安装 重新编译 到 5 14 0 中 我可以 已经使用 cpanp 和 b 选项生成了已安装模块的捆
  • 在 R 中将矩阵组合成数组

    如果我创建了多个矩阵 如何将它们组合成一个数组 我有 8 个矩阵 每个矩阵有 200 行和 200 列 我需要将它们组合成一个 dim 200 200 8 的数组 所以我希望每个矩阵都是数组的一部分 您可以使用abind函数从abind包裹
  • 强制构建全局对象

    代码如下 struct S S debugbreak static const S g s 显然 我希望一些代码在启动时运行 这仅适用于某些具有外部代码引用的符号的源文件 对于静态库中没有任何从外部引用的符号的源文件 看起来编译器或链接器会
  • 如何声明带有值的 ArrayList? [复制]

    这个问题在这里已经有答案了 Java 中的 ArrayList 或 List 声明 https stackoverflow com questions 12321177 arraylist declaration java已提问并回答了如何
  • 是否可以在由同一父进程创建的两个子进程之间建立管道(LINUX,POSIX)

    我有多个孩子由同一个父母 分叉 我尝试构建pipe所有这些子进程之间的连接就像一个链表结构 孩子 1 向孩子 2 发送数据 孩子 2 向孩子 3 孩子 N 向孩子 1 发送数据 有没有正确的方法可以做到这一点 此外 如果我在进程之间创建和通