最后一个分叉的孩子不会死

2023-12-23

我的主进程分叉了两次,从而创建了两个子进程。这两个孩子是这样相互沟通的:

ls | more

现在的问题是,第二个孩子永远不会死。这是为什么?管道中的最后一个孩子什么时候真正死亡?

删除一个wait()调用显示了预期结果ls | more但给出了一些进一步奇怪的行为(卡住终端等)。

这是我的代码:

int main(){
  printf("[%d] main\n", getpid());
  int pip[2], i;
  pipe(pip);

  /* CHILDREN*/
  for (i=0; i<2; i++){
    if (fork()==0){

      /* First child */
      if (i==0){
        printf("[%d] child1\n", getpid());
        close(1); dup(pip[1]);
        close(pip[0]);
        execlp("ls", "ls", NULL);}

      /* Second child */
      if (i==1){
        printf("[%d] child2\n", getpid());
        close(0); dup(pip[0]);
        close(pip[1]);
        execlp("more", "more", NULL);}
    }  
  }
  wait(NULL);  // wait for first child
  wait(NULL);  // wait for second child
  return 0;
}

在所有用户关闭写入端之前,管道的读取端不会获得 EOF 标记。两个孩子的父母仍然有管道的两端开放,所以more没有看到 EOF(从返回 0read()),并继续等待更多输入。

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

最后一个分叉的孩子不会死 的相关文章

随机推荐

  • 自定义字体为 Android 中的某些字母组合提供了不正确的字形

    我在我的 Android 项目中使用自定义字体 由于某种原因 当文本包含字母时IJ一起 它给了我以下字形 这似乎是位于 uE2C5字体的 PUA 区域 个人I and J字形都存在于字体中 如果我将文本设置为 我可以让它们出现I J 它不是
  • 访问 Angular2 模板中的特定数组元素

    我有一个可以循环使用的数组ng for句法 然而 最终我只想访问该数组的一个元素 我不知道该怎么做 在我的组件脚本中我有 export class TableComponent elements IElement 在我的模板中 我可以通过循
  • 以编程方式原生 Android VPN

    这个问题存在变体 但我似乎无法理解某些东西 如果您阅读了功能末尾的内容工业控制系统 4 0 http developer android com about versions android 4 0 highlights html 其中提到
  • 如何跟踪迭代开始日期后已添加到冲刺中的 Azure 工作项?

    Folks 首先 这个问题基于这样的前提 我通过分析视图连接 Azure DevOps 数据 并且所有可用字段都已选择到视图中 我想跟踪开发团队是否坚持计划或处理已创建的积压项目或在冲刺开始后已添加到冲刺中的项目 但我不知道该怎么做 显然
  • 列出 Debian 中所有用户安装的软件包

    在我参加的一次网络安全竞赛中 我获得了一台安装了许多软件包的 Debian 虚拟机 并要求我清理无关或恶意的软件包 过去我用过dpkg l grep searchterm 以及执行此任务的常用包的列表 然而 这是极其低效且耗时的 为了加快我
  • Spring FactoryBean 和作用域一起工作

    我想一起使用 FactoryBeans 和作用域 具体来说 我希望将 FactoryBean 创建和返回的对象放置到指定的 可能是自定义的 范围中 问题在于执行以下操作
  • 如何更改 Winforms 按钮上第二行文本的字体大小和颜色?

    this Controls Add button button Font new Font Arial 8 button Name btn idDanych button Width 100 button Height 100 button
  • 奇怪的文件查找行为

    对于下面的两次交互 我希望两者输出相同的文件 但第二个交互写入文件末尾 唯一的区别是写入后的读取语句 我不明白发生了什么 我缺少什么 预期行为 gt gt gt f open test txt w gt gt gt f write 0123
  • Java API核心类的maven-javadoc-plugin和inheritDoc

    我正在编写自己的 Java 8 Stream 实现 并希望继承原始版本的 Javadocsjava util stream Stream界面 但是我无法让它工作 生成的 Javadoc 仅显示我的文档 但不显示扩展 Stream 接口的文档
  • 正则表达式:在一段文本中查找BB代码

    我正在尝试匹配随机文本中的 url BB 代码标记 示例文本 Lorem ipsum dolor sat amet consectetur adipiscing elit 网址 http www google com url http ww
  • 获取其中包含歌曲的流派名称列表

    我正在使用 CursorLoder 类从 android 的媒体内容提供程序获取流派列表 下面是我的光标查询来获取流派列表 public Loader
  • 将列表从 QSharedMemory 复制到 sip.voidptr 的 Pythonic 方法

    我正在使用 PyQT5 和 QSharedMemory 类 我正在创建一个可以容纳 6 个 1 字节元素的共享内存 为了将这些元素复制到共享内存数组中 我循环遍历 python 列表中的元素 如下所示 f shared mem data k
  • Windows批处理文件:查找目录,如果不存在,则创建,然后将文件移动到该目录

    我正在尝试创建一个批处理文件或其他脚本 以将一个文件夹的内容转移到另一个目录中包含其名称的文件夹中 例如 ShowName Episode Title mkv 应移至 movies showname 如果 movies showname 不
  • Powerpoint VBA 撤消

    我有 VBA 代码 可以处理 PowerPoint 文件中的许多幻灯片 部分代码临时调整幻灯片大小 以便我可以以不同的纵横比导出图像 我无法再次调整它们的大小 因为 PowerPoint 永远不会将它们的内容完全恢复到调整大小之前的样子 所
  • PHP:preg_match - “分隔符不能是字母数字或反斜杠”[重复]

    这个问题在这里已经有答案了 有谁知道这个正则表达式有什么问题吗 它在 RegexPal 和 RegExr 等网站上运行良好 但在 PHP 中它给我这个警告并且没有结果 Warning preg match function preg mat
  • 使用 constexpr-if 时出错:在 'constexpr' 之前预期有 '('

    我正在尝试使用 if constexpr 来检查某些内容 但遇到类似错误 constexpr 之前应有 前面没有 if 的 else 到目前为止我检查我的代码没有任何问题 我的编译标志是 g std c 17 main cpp includ
  • mac os x 下进程使用的内存

    给定PID 如何获取进程当前使用的内存 具体来说 我正在寻找 进程使用的私有物理内存 RAM 进程使用的交换空间 但我对映射文件和共享内存不感兴趣 简而言之 我想确定通过终止 PID 将释放多少内存 RAM 和交换 这有用吗 您可以使用ps
  • Django 中的 2 个表单、1 个视图、2 个 SQL 表

    我正在努力了解如何将两个 django 表单中的数据提交到两个单独的数据库表中相同的观点 我只想要一个提交按钮 尽管this https stackoverflow com questions 1395807 proper way to h
  • 一个按钮是否可以有 2 种不同的背景颜色(以及 css 按钮)

    我想要实现的就是这样的事情 你好 hi 位于两种颜色的中间 我让它适用于一种颜色和下面的另一种颜色 但希望颜色在文本中间分开 如果没有人能想出使用 css 的解决方案 我将使用按钮图像 尽量避免使用图像 编辑 当然CSS结果必须跨浏览器 即
  • 最后一个分叉的孩子不会死

    我的主进程分叉了两次 从而创建了两个子进程 这两个孩子是这样相互沟通的 ls more 现在的问题是 第二个孩子永远不会死 这是为什么 管道中的最后一个孩子什么时候真正死亡 删除一个wait 调用显示了预期结果ls more但给出了一些进一