管道、dup2 和 exec()

2024-01-08

我必须编写一个可以运行管道的外壳。例如像这样的命令ls -l | wc -l”。我已经成功解析了用户给出的命令,如下所示:

“ls”=第一个cmd

“-l”=frsarg

“wc” = scmd

“-l”=secarg

现在我必须使用两个叉子,因为命令是两个和一个管道。 我编写的用于执行该命令的代码块如下:

pid_t pid;
int fd[2];

pipe(fd);
pid = fork();

if(pid==0)
{        
    dup2(fd[WRITE_END], STDOUT_FILENO);
    close(fd[READ_END]);
    execlp(firstcmd, firstcmd, frsarg, (char*) NULL);
}
else
{ 
    pid=fork();

    if(pid==0)
    {
        dup2(fd[READ_END], STDIN_FILENO);
        close(fd[WRITE_END]);
        execlp(scmd, scmd, secarg, (char*) NULL);
    }
}

所以当我运行 shell 并输入命令时ls -l | wc -l(例如)exec 的结果没有显示,但 shell 保持正常运行。

奇怪的是,只有当我用“exit”或“^C”终止 shell 时,命令的结果才会显示。

该输出有什么问题?为什么我输入命令后不立即显示?


您需要关闭父进程和子进程中的所有管道描述符(在子进程中复制之后)。在您的代码中,主要问题是wc进程不会退出,因为仍然有写入者存在(因为父进程尚未关闭写入端)。变化如下所示。我还添加了waitpid在父进程中等待wc过程。

pid_t pid;
int fd[2];

pipe(fd);
pid = fork();

if(pid==0)
{
    dup2(fd[WRITE_END], STDOUT_FILENO);
    close(fd[READ_END]);
    close(fd[WRITE_END]);
    execlp(firstcmd, firstcmd, frsarg, (char*) NULL);
    fprintf(stderr, "Failed to execute '%s'\n", firstcmd);
    exit(1);
}
else
{ 
    pid=fork();

    if(pid==0)
    {
        dup2(fd[READ_END], STDIN_FILENO);
        close(fd[WRITE_END]);
        close(fd[READ_END]);
        execlp(scmd, scmd, secarg,(char*) NULL);
        fprintf(stderr, "Failed to execute '%s'\n", scmd);
        exit(1);
    }
    else
    {
        int status;
        close(fd[READ_END]);
        close(fd[WRITE_END]);
        waitpid(pid, &status, 0);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

管道、dup2 和 exec() 的相关文章

  • 使用具有现有访问令牌的 Google API .NET 客户端

    用例如下 移动应用程序正在通过 Google 对用户进行身份验证 并且在某些时候 我们需要将用户的视频发布到他的 YouTube 帐户 出于实际原因 实际发布应该由后端完成 已经存储在那里的大文件 由于用户已经通过应用程序的身份验证 因此应
  • 为什么我不能用 `= delete;` 声明纯虚函数?

    Intro 纯虚函数使用通用语法声明 virtual f 0 然而 自 c 11 以来 有一种方法可以显式地传达non existence 特殊 成员函数的 Mystruct delete eg default constructor Q
  • C# 中的接口继承

    我试图解决我在编写应用程序时遇到的相当大的 对我来说 问题 请看这个 为了简单起见 我将尝试缩短代码 我有一个名为的根接口IRepository
  • Clang 编译器 (x86):80 位长双精度

    我正在尝试在 x86 Windows 平台上使用本机 80 位长双精度 海湾合作委员会选项 mlong double 80 https gcc gnu org onlinedocs gcc x86 Options html似乎不适用于 cl
  • 对齐 GridView 中的行值

    我需要在 asp net 3 5 中右对齐 gridview 列中的值 我怎样才能做到这一点
  • POCO HTTPSClientSession 发送请求时遇到问题 - 证书验证失败

    我正在尝试使用 POCO 库编写一个向服务器发出 HTTPS 请求的程序 出于测试目的 我正在连接到具有自签名证书的服务器 并且我希望允许客户端进行连接 为了允许这种情况发生 我尝试安装InvalidCertificateHandler这是
  • C++ 异步线程同时运行

    我是 C 11 中线程的新手 我有两个线程 我想让它们同时启动 我可以想到两种方法 如下 然而 似乎它们都没有按照我的预期工作 他们在启动另一个线程之前启动一个线程 任何提示将不胜感激 另一个问题是我正在研究线程队列 所以我会有两个消费者和
  • shell-out 值到 md5(加密)函数

    我正在寻找一种解决方案 我正在构建 JSON 记录 并需要在 JQ 中生成一些文本 但将此文本通过管道传输到 MD5 求和函数并将其用作键的值 echo first John last Big jq id first last md5 通过
  • 暂停下载线程

    我正在用 C 编写一个非常简单的批量下载程序 该程序读取要下载的 URL 的 txt 文件 我已经设置了一个全局线程和委托来更新 GUI 按下 开始 按钮即可创建并启动该线程 我想要做的是有一个 暂停 按钮 使我能够暂停下载 直到点击 恢复
  • ASP MVC:服务应该返回 IQueryable 的吗?

    你怎么认为 你的 DAO 应该返回一个 IQueryable 以便在你的控制器中使用它吗 不 您的控制器根本不应该处理任何复杂的逻辑 保持苗条身材 模型 而不是 DAO 应该将控制器返回给视图所需的所有内容 我认为在控制器类中看到查询 甚至
  • Qt 创建布局并动态添加小部件到布局

    我正在尝试在 MainWindow 类中动态创建布局 我有四个框架 它们是用网格布局对象放置的 每个框架都包含一个自定义的 ClockWidget 我希望 ClockWidget 对象在调整主窗口大小时相应地调整大小 因此我需要将它们添加到
  • 如何重置捕获像素的值

    我正在尝试创建一个 C 函数 该函数返回屏幕截图位图中每四个像素的 R G 和 B 值 这是我的代码的一部分 for int ix 4 ix lt 1366 ix ix 4 x x 4 for int iy 3 iy lt 768 iy i
  • C# 中条件编译符号的编译时检查(参见示例)?

    在 C C 中你可以这样做 define IN USE 1 define NOT IN USE 1 define USING system 1 system 1 IN USE 进而 define MY SYSTEM IN USE if US
  • 通过 NHibernate 进行查询,无需 N+1 - 包含示例

    我有一个 N 1 问题 我不知道如何解决它 可以在这个问题的底部找到完全可重复的样本 因此 如果您愿意 请创建数据库 设置 NUnit 测试和所有附带的类 并尝试在本地消除 N 1 这是我遇到的真实问题的匿名版本 众所周知 这段代码对于帮助
  • 在 C 中使用 GNU automake 中的解析器

    我是 GNU autotools 的新手 在我的项目中使用了 lex 和 yacc 解析器 将它们作为 makefile am 中的源代码会产生以下错误 配置 in AC CHECK PROGS YACC bison yacc none i
  • 获取 2 个数据集 c# 中的差异

    我正在编写一个简短的算法 它必须比较两个数据集 以便可以进一步处理两者之间的差异 我尝试通过合并这两个数据集并将结果更改放入新的数据集来实现此目标 我的方法如下所示 private DataSet ComputateDiff DataSet
  • g++ 对于看似不相关的变量“警告:迭代...调用未定义的行为”

    考虑以下代码strange cpp include
  • 双精度类型二维多维数组的 pinvoke 编组作为 c# 和 c++ 之间的输入和输出

    我有以下我正在尝试解决的双物质类型的 2d 多维数组的 c 和 c pinvoke 编组 我已经查看了以下热门内容以获得我目前拥有的内容使用双精度数组进行 P Invoke 在 C 和 C 之间编组数据 https stackoverflo
  • 用于 C# XNA 的 Javascript(或类似)游戏脚本

    最近我准备用 XNA C 开发另一个游戏 上次我在 XNA C 中开发游戏时 遇到了必须向游戏中添加地图和可自定义数据的问题 每次我想添加新内容或更改游戏角色的某些值或其他内容时 我都必须重建整个游戏或其他内容 这可能需要相当长的时间 有没
  • 是否可以在 C# 中强制接口实现为虚拟?

    我今天遇到了一个问题 试图重写尚未声明为虚拟的接口方法的实现 在这种情况下 我无法更改接口或基本实现 而必须尝试其他方法 但我想知道是否有一种方法可以强制类使用虚拟方法实现接口 Example interface IBuilder

随机推荐

  • readline() 函数在网络浏览器中不起作用

    每次我想运行我的代码时 它都显示没有输入 我使用 Xampp 在浏览器上运行它 这在浏览器 readline 中不起作用 将被跳过 回声给出一个空值 https www php net readline https www php net
  • 如何在Android中安全地存储密钥?

    我正在阅读有关存储密钥 用于加密 解密数据 的信息 似乎无法实现这一点 攻击者实现这一目标只会增加难度 真的是这样吗 到目前为止我所得到的 存储在共享首选项 私人模式 中 已 Root 的手机将能够检索它 NDK C C 本机代码 创建 s
  • Sinatra 服务器推送?

    将数据从用 Sinatra 编写的服务器推送到客户端的最佳方法是什么 与聊天室类似 但没有 Ajax 每 2500 毫秒轮询一次 我知道 Rails 中的 Juggernaut 但对 Sinatra 很好奇 谷歌搜索一下出现了Marc An
  • VB.net动态单选按钮添加事件onclick

    您好 我对这段代码有问题 我从数据库中获取 ID 和名称 然后将每一行添加到新的 RadioButton 中 但是如何使用 msgbox onclick 获取 id 代码是这样的 Imports MySql Data MySqlClient
  • Bootstrap 菜单在移动视图中默认不折叠

    我尝试使用 twitter bootstrap 3 0 实现自动折叠的垂直导航 基本功能有效 窗口大小小 顶部的菜单应该如此 但问题是 如果我使用 bootstrap 中的默认导航栏功能 它不会折叠 div class container
  • python图像识别[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我想做的是一个简单应用程序的图像识别 给定图像 500 x 500 pxs 1 种颜色背景 该图像将只有 1 个 50x50 像素的几何图
  • 如何使用 appium 来自动化 Android 上的浏览​​器?

    我想使用appium在android手机上自动化浏览器 但我不知道如何设置该功能 首先 我在 Android 设备的开发者选项中启用了 USB 调试 其次 adb 运行良好 我可以看到设备 ID 第三 我从Appium for window
  • 当鼠标一段时间没有移动时,用jQuery隐藏div元素?

    我有一个广播视频网站 带有一个菜单 当鼠标一段时间 假设 10 秒 不移动时 应该隐藏该菜单 同样 随着鼠标移动 它应该会重新出现 使用 css 和 jQuery 执行此操作的最佳方法是什么 先感谢您 看看mousemove http ap
  • 隐藏直方图

    所以我想绘制正态分布 我已经看到一种方法是使用以下代码 import numpy as np import matplotlib pyplot as plt mu 5 sigma 1 s np random normal mu sigma
  • 如何创建 C 工厂函数?

    我有一个带有函数指针的结构 如下所示 typedef int node transition func wint t typedef struct lex dfa arc t node transition func func int ex
  • C中的按位移位[重复]

    这个问题在这里已经有答案了 我得到了一些令我困惑的 C 代码 int a 1 int b 32 printf d n d n a lt
  • 在Python中强制函数参数类型?

    我在 Python 类中有一个函数 可以将接口添加到列表中 def RegisterAsListener self inListener self TransitListeners append inListener 这很好 因为一个类只需
  • 在类函数中定义类函数:Python

    我有一个代码 我想在类函数中定义一个类函数 这是我想做的一个简单的例子 该程序的目标是打印 4 gt gt gt class bluh def haha self print 3 def init self def haha self pr
  • Xrm.Page.data 为空

    我在机会实体上添加了一个自定义表单 并附加了一些 javascript 我使用 window open 和 url 中的 formId 来调用表单来打开表单 并且仅用于创建机会实体 在 javascript 中 我只是尝试填充一些字段 但
  • 使用 PHP 和 HTML 时的最佳实践是什么?

    我设计网站已经有一段时间了 但在使用 PHP 和 HTML 时 有一点我一直不太确定 整个文档用 PHP 编写是不是更好 echoHTML 像这样 或者有一个像这样的 HTML 文件 然后添加到 PHP 中 div Content div
  • 人们使用类加载做什么?

    因此 每本 Java 教科书都会谈论 Java 的灵活性 因为它可以在运行时加载类 只需拼凑一根绳子并将其交给Class forName 并抓住ClassNotFoundException并处理它 理论就讲这么多 您能否举例说明如何使用 J
  • 在鼠标悬停时动态添加和删除类 - Vue.js

    我可以使用 Vue 成功地在鼠标悬停时添加一个类 但我想在鼠标离开元素时删除该类 在 Vue 中处理这个问题的惯用方法是什么
  • MongoDB $或查询

    我在 mongo shell 中运行以下查询 db Profiles find or name gary name rob 它只是按预期返回任何内容 JSON Use in 对于问题中的查询 使用更合适 in http docs mongo
  • Websocket 跨页面 JavaScript

    我用 JS 实现了一个基本的 websockets 客户端 function connectToNotifServer var conn new WebSocket ws localhost 8080 conn onopen functio
  • 管道、dup2 和 exec()

    我必须编写一个可以运行管道的外壳 例如像这样的命令ls l wc l 我已经成功解析了用户给出的命令 如下所示 ls 第一个cmd l frsarg wc scmd l secarg 现在我必须使用两个叉子 因为命令是两个和一个管道 我编写