当前位置: 首页 > 面试题库 >

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

暴招
2023-03-14
问题内容

我有多个由同一父节点“分叉”的子节点,并且我尝试pipe在所有这些子进程之间构建连接,例如链表结构。孩子1向孩子2发送数据,孩子2向孩子3发送数据。孩子N向孩子1发送数据。有什么适当的方法吗?

另外,如果我在流程之间创建和通信,如何迫使父级“等待”所有流程以完成其工作,wait()或者waitpid()等待第一个完成的流程,但我需要等待所有流程。这是另一个出现的问题。

谢谢…


问题答案:

本质上,这就是外壳程序构建重定向链的方式,即类似

ls | grep foo | sort | uniq

在Unix编程上有一些很棒的介绍性文本,其中通过本书实现了一个简单的shell。Shell的任务之一是重定向。其中一本书是Michael K.
Johnson和Erik W. Troan撰写的“ Linux Application Programming”。

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

要为N个进程构建重定向链,您需要N-1个管道。对于每个重定向,请使用pipe(int fds[2])系统调用创建管道。在使用之后fork(),但在execv使用之前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。我之所以这样说,是因为我有一些对货物狂热编程的学生,他们盲目地将目标fds也用于管道syscall数组。

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



 类似资料:
  • 如何使用gcc 7.2.0在64位DebianLinux上的C中创建两个独立的随机数生成器(无需加密安全)?两个RNG中的一个应该使用,而另一个应该使用命令行参数初始化以创建可重复的实验。下面的示例将为同一个RNG播种两个不同的值,这将如何工作有两个不同的可能的调用? 这样做的目的是,我使用一个RNG动态生成问题实例,在所有实验运行中都应该是相同的,因此在所有程序重新启动时遵循相同的种子。第二个R

  • 嗨,我只是想知道有没有可能创建一个通用类来确认ObserveObject协议,它可以被多个ContentView使用。 如果我能做到这一点,那么我将能够使我的ContentView和Model类完全通用和可重用。 我希望实现的一个例子: 如果我能做到这一点,任何类都可以实现ContentViewModelType,并成为ContentView的模型,使其通用且可重用。举个例子 但是当我尝试初始化C

  • 问题内容: 我正在编写一个Python脚本,该脚本需要将一些数据写入临时文件,然后创建一个运行C ++程序的子进程,该程序将读取该临时文件。我正在尝试使用此功能,但是根据文档, 在命名的临时文件仍处于打开状态时,是否可以使用该名称第二次打开文件,会因平台而异(可以在Unix上使用;在Windows NT或更高版本上不能使用)。 实际上,在Windows上,如果我在写入后刷新了临时文件,但是在我希望

  • 我尝试使用批注将连接到 从数据库生成类。 例外情况是: null 有人有类似的问题吗?有什么解决办法吗?这可能是虫子吗?!

  • 从这篇文章中,我发现我可以使用序列Ctrl+P+Ctrl+Q从docker容器中分离。 我想知道,是否可以创建一个bash(或python或其他)脚本,它进入docker容器,运行几个命令,然后使用转义序列退出容器?我认为可能不可能,但请确认/否认这一点!

  • 人员节点: 名字 姓氏 地址 电子邮件 电话号码 公司节点: 姓名 地址 电子邮件 电话号码 关系: 个人-[配偶]- 个人和实体: 当我为简创建一个人时,我也添加了与约翰的兄弟姐妹关系。 运行检索节点Jane和对应的同级节点John。 但是,手足关系应该是双向的。运行仅检索节点John。 这就是问题所在。我可以在约翰和简之间添加另一种兄弟姐妹关系。但是,这实际上在两者之间创建了一个无限循环。以及