管道和流程管理

2024-04-23

我正在开发一个用 C 实现的小型 shell(tsh)(这是一项作业)。作业的一部分属于 PIPING。我必须将一个命令的输出通过管道传输到另一个命令。例如:ls -l | sort

当我运行 shell 时,我在其上执行的每个命令都由它生成的子进程处理。子进程完成后,返回结果。对于管道,我想首先实现一个编码示例来检查它是如何工作的。我写了一个方法,部分有效。问题是当我运行管道命令时,子进程完成后,整个程序随之退出!显然我没有正确处理子进程信号(下面的方法代码)。

我的问题:

  • 使用 pipeline() 进行进程管理是如何工作的?如果我运行命令ls -l | sort它是否创建一个子进程ls -l和另一个过程sort?从我到目前为止看到的管道示例来看,只创建了一个进程(fork())。

  • 当第二个命令(sort从我们的示例)已处理,我如何获取其进程 ID?

编辑:另外,在运行此代码时,我得到了两次结果。不知道为什么它运行两次,那里没有循环。

这是我的代码:

pid_t pipeIt(void){
    pid_t pid;
    int pipefd[2];

    if(pipe(pipefd)){
        unix_error("pipe");
        return -1;
    }

    if((pid = fork()) <0){
        unix_error("fork");
        return -1;  
    }
    if(pid == 0){
        close(pipefd[0]);
        dup2(pipefd[1],1);
        close(pipefd[1]);
        if(execl("/bin/ls", "ls", (char *)NULL) < 0){
            unix_error("/bin/ls");
            return -1;
        }// End of if command wasn't successful

    }// End of pid == 0
    else{
        close(pipefd[1]);
        dup2(pipefd[0],0);
        close(pipefd[0]);
        if(execl("/usr/bin/tr", "tr", "e", "f", (char *)NULL) < 0){
            unix_error("/usr/bin/tr");
            return -1;
        }
    }

    return pid;

}// End of pipeIt

是的,shell 必须分叉才能执行每个子进程。请记住,当您致电其中一位execve()函数族,它replaces当前进程映像与已执行的进程映像。如果您的 shell 直接执行子进程,则它无法继续处理进一步的命令,因为此后它不再存在(除非作为子进程)。

要修复它,只需fork()再次在pid == 0分支,并执行ls对那个孩子的命令。记得wait()对于两个(所有)子进程,如果您不想异步执行管道。

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

管道和流程管理 的相关文章

随机推荐

  • 使用 Javascript/JQuery 解析自动生成的 .NET 日期对象

    有一些关于此的帖子 但没有回答这个具体问题 服务器返回这个 Date 1304146800000 我不想更改服务器端代码 而是解析 Net 生成的 JSON 对象中包含的日期 这看起来并不难 因为看起来就快到了 然而 至少在这些论坛中 似乎
  • 如何在elasticsearch中使用冒号搜索模式?

    我在 Elasticsearch 中有一个字段 其值为 ft 05 08 2015 13 01 27 358 cgn 4189 当我想使用查询字符串 cgn 4189 进行搜索时 我没有结果 我尝试像 cgn 4189 一样转义冒号 但有语
  • 无法从双精度转换为浮点

    在我的数据库中 我有几个 真实 字段 结构如下 database execSQL create table TABLE LOGS COLUMN ID integer primary key autoincrement COLUMN ID D
  • 如何更改 Laravel 中 404 未找到视图上的文本?

    我正在使用 Laravel 设置 API 当我输入不存在的路线时 我会被重定向到显示 404 的视图 未找到 我怎样才能改变这个观点abort response gt json Not Found 404 这样尝试通过另一个应用程序访问 A
  • PHP cURL 选项 CURLOPT_HEADER 和 CURLOPT_RETURNTRANSFER 是否冲突

    我正在使用 cURL 和 php 来对 API 进行身份验证 像这样 ch curl init headers headers Content Type application json curl setopt ch CURLOPT HTT
  • AngularJS 摘要循环运行的频率是多少?

    在讨论 AngularJS 的优点时 双向数据绑定通常被认为是 Angular 相对于其他 JS 框架的主要优点 深层发掘 https docs angularjs org guide scope integration with the
  • 迭代从 MongoDB 获取的字符串数组

    我正在使用蒙戈小猫 https github com OpenKitten MongoKitten从 mongoDB 获取文档的库 我的 mongoDB 中有以下文档 foo A B 我可以查询数据库 但无法循环foo返回文档的数组 例如
  • python - Flask_simpleldap 不会绑定

    我在用着烧瓶 simpledap https github com admiralobvious flask simpleldap并且正在努力获得绑定连接来执行任何有用的操作 我的 LDAP 服务器是活动目录 精简后的代码如下所示 几乎与这
  • 使用 nginx 代理时在 RStudio 中运行闪亮的应用程序

    我正在尝试使用通过 nginx 代理的 RStudio 服务器来开发一个闪亮的应用程序 当我使用 RStudio 而不是服务器 来运行闪亮的应用程序时 一切正常 但是 当我通过代理 RStudio 运行时 该应用程序出现在 查看器 窗格中
  • Python pickle 不是一对一的:不同的 pickle 给出相同的对象

    有人可以解释一下吗 pickle loads b x80 x03X x01 x00 x00 x00 q x00h x00 x86q x01 pickle loads b x80 x03X x01 x00 x00 x00 q x00X x01
  • Android 猴子跑步脚本

    我正在尝试通过 Monkey runner 命令提示符执行示例 python 程序 但它抛出错误 Can t open specified script file Usage monkeyrunner options SCRIPT FILE
  • 如何解析 WordOpenXML 输出中的 mathML?

    我只想读取用于生成方程的 xml 这是我通过使用获得的Paragraph Range WordOpenXML 但用于方程的部分并不符合MathML我发现Equation微软的MathML 我是否需要使用一些特殊的转换器来获取所需的 xml
  • For 循环有效,但 For Each 无效。为什么?

    在包含 forEach 循环的行上抛出了越界异常 但据我所知 这段代码没有任何问题 for 循环从 char 数组的元素 0 开始并循环直到到达最后一个元素 但是当我使用更长的 for 循环尝试此代码时 即 for int i 0 i lt
  • 更改 maven pom.xml 中传递依赖项的版本

    我一直在尝试覆盖我的一个项目中的传递依赖版本 我在 github 上找到了以下示例项目来进行实验 https github com Richou swagger codegen maven plugin https github com R
  • 求 2 次幂的算法

    我找到了一个小算法来确定一个数字是否是 2 的幂 但没有解释它是如何工作的 到底发生了什么 var potence n gt n n n 1 for var i 2 i lt 16 i if potence i console log i
  • Android ACTION_IMAGE_CAPTURE 与内存中的 EXTRA_OUTPUT

    当我打电话时用相机拍照时 File file new File getFilesDir getAbsolutePath myImage jpg Uri outputFileUri Uri fromFile file cameraIntent
  • $elemMatch 的 MongoDB 索引

    索引帮助页面位于http www mongodb org display DOCS Indexes http www mongodb org display DOCS Indexes没有提到 elemMatch 因为它说要在我的 2M 对象
  • iOS 11:大标题的 UINavigationBar 高度(模仿 Apple Music 应用)

    我试图模仿UINavigationBar由 Apple Music 应用程序使用 日期显示在大标题上方 我知道 Apple Music 应用程序不使用该标准UINavigationBar of ios11 questions tagged
  • 数据框中值之间的距离

    我有一个数据框 其中包含一系列虚拟变量 这些变量指示在另一个事件 a 之前发生的事件类型 e1 e2 我需要知道从类型 e1 和 e2 的每个事件到下一个事件 a 的索引值的距离 我尝试使用显示的数据进行演示 我已经研究了一些解决方案 包括
  • 管道和流程管理

    我正在开发一个用 C 实现的小型 shell tsh 这是一项作业 作业的一部分属于 PIPING 我必须将一个命令的输出通过管道传输到另一个命令 例如 ls l sort 当我运行 shell 时 我在其上执行的每个命令都由它生成的子进程