C 中管道命令的问题

2024-02-07

我正在尝试用 C 语言为 Unix 创建一个简单的 shell。我已经能够完成所有命令的解析和执行,但我遇到了管道问题。我认为问题在于我没有连接到正确的管道来输入第二个命令。

例如,如果我输入“ls | wc”,它会在“wc”命令之后暂停,我认为这是因为它在等待输入。我认为问题是当我使用 dup2(reading[i],0) 时,它没有连接到正确的管道。

我知道这是一个有点宽泛的问题,但如果我能得到任何指示,我将不胜感激。下面是创建新进程并尝试通过管道传输它们的代码。

    int fileds[2];
    int reading[num_cmds];
    int writing[num_cmds];

    int p;
    for(p=0; p < num_cmds; p++)
    {
        reading[p] = -1;
        writing[p] = -1;
    }

    int j;
    for(j=0; j < num_cmds-1; j++)    //Create pipes for commands
    {
        int fileds[2];
        pipe(fileds);
        reading[j+1] = fileds[0];
        writing[j] = fileds[1];
    }

    int i = 0;
    for(i = 0; i < num_cmds;i++)
    {           
        cmd_args = parse_cmd(cmds[i],output_file,input_file,&run_bg); //Get command and args

        pid_t childpid;
        int status;
        childpid=fork();

        if (childpid >= 0) 
        {
            if (childpid == 0) 
            {               
                if(writing[i] != -1)
                {
                    dup2(writing[i],1);
                    close(writing[i]);
                }

                if(reading[i] != -1)
                {
                    dup2(reading[i],0);
                    close(reading[i]);
                }

                int h;
                for(h = 0; h < num_cmds; h++)
                {
                    close(writing[h]);
                    close(reading[h]);
                }

                if(execvp(cmd_args[0],cmd_args) == -1) 
                {
                    perror("Problem with command");
                    exit(0);
                }
            }
            else 
            {
                wait(&status);
                int m;
                for(m = 0; m < num_cmds; m++)
                {
                    if( writing[m] != -1) close(writing[m]);
                    if( reading[m] != -1) close(reading[m]);
                }
            }
        }
        else 
        {
             perror("fork"); 
             continue;
        }


        input_file[0] = 0;
        output_file[0] = 0;
        run_bg = 0;
    }

}

更新:感谢理查德,我能够弄清楚了。这是以错误的顺序关闭文件描述符和根本不关闭某些文件描述符的组合。这是工作代码。

int fileds[2];
    int reading[num_cmds];
    int writing[num_cmds];

    int p;
    for(p=0; p < num_cmds; p++)
    {
        reading[p] = -1;
        writing[p] = -1;
    }

    int j;
    for(j=0; j < num_cmds-1; j++)
    {
        int fileds[2];
        pipe(fileds);
        reading[j+1] = fileds[0];
        writing[j] = fileds[1];
    }

    int i = 0;
    for(i = 0; i < num_cmds;i++)
    {           
        cmd_args = parse_cmd(cmds[i],output_file,input_file,&run_bg);

        pid_t childpid;
        int status;
        childpid=fork();

        if (childpid >= 0) 
        {
            if (childpid == 0) 
            {               
                if(writing[i] != -1)
                {
                    close(1);
                    dup2(writing[i],1);
                }

                if(reading[i] != -1)
                {
                    close(0);
                    dup2(reading[i],0);
                }

                if(execvp(cmd_args[0],cmd_args) == -1) 
                {
                    perror("Problem with command");
                    exit(0);
                }
            }
            else 
            {

                wait(&status);
                close(writing[i]);

                if(i > 0) 
                {
                    close(reading[i]);
                }
            }
        }
        else 
        {
             perror("fork");
        }


        input_file[0] = 0;
        output_file[0] = 0;
        run_bg = 0;
    }

我认为你的问题可能是你等待循环内的每个进程,然后关闭所有文件描述符。这使得文件描述符对于下一次调用 dup2() 无效,并导致下一个进程的标准输入保持不变。

只是猜测,我还没有运行代码。

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

C 中管道命令的问题 的相关文章

  • C++,多语言/本地化支持

    向 C 程序添加多语言支持的最佳方法是什么 如果可能 应该从包含键值对 WelcomeMessage Hello s 之类的纯文本文件中读取语言 我想到了添加一个 localizedString key 函数来返回加载的语言文件的字符串 有
  • fork 和 exec 之间的区别

    两者有什么区别fork and exec 指某东西的用途fork and exec它体现了 UNIX 的精神 它提供了一种非常简单的方法来启动新进程 The fork调用基本上复制了当前进程 在almost任何方式 并非所有内容都会被复制
  • 以概率从列表中选择随机元素

    我有一个包含四个项目 A B C D 的列表 每个项目都有被选择的概率 例如 A 有 74 的机会被选中 B 15 C 7 D 4 我想创建一个函数 根据其概率随机选择一个项目 有什么帮助吗 为您的项目定义一个类 如下所示 class It
  • stl 集的 C# 等效项是什么?

    我想使用 C 将一些值存储在平衡二叉搜索树中 我查看了泛型命名空间中的集合 但没有找到与 stl 集合等效的集合 我可以使用什么通用集合 我不想存储键 值对 只是值 你可以使用HashSet http msdn microsoft com
  • .NET Core 2 - 从启动中调用存储库方法[重复]

    这个问题在这里已经有答案了 我有以下存储库和类 public interface IValueService GetAll public class ValueService IValueService private DataContex
  • 公共领域有哪些替代方案?

    我正在用 java 编写一个游戏 正如问题标题建议的那样 我在类中使用公共字段 暂且 据我所知 公共领域很糟糕 我有一些理解其中的原因 但如果有人能澄清为什么你不应该使用它们 那将不胜感激 问题是 从我所看到的来看 这似乎是合乎逻辑的 是使
  • 泛型类上的 DebuggerDisplay

    我在应用时遇到问题DebuggerDisplay泛型类的属性 DebuggerDisplay foo class Foo DebuggerDisplay Bar t class Bar
  • 二元运算符重载、隐式类型转换

    class my bool private bool value public my bool bool value value value explicit operator bool return value friend my boo
  • 模板“内联”函数的静态局部变量[重复]

    这个问题在这里已经有答案了 static的局部变量inline如果我的理解是正确的 C 中的函数保证像单个全局变量一样存在 如果inline函数是一个模板 编译器可以在哪里生成该函数的多个版本 下面这篇文章应该很好地回答你的问题 http
  • 如何设置cookie值?

    我正在执行以下操作来设置 cookie 值 HttpCookie mycookie new HttpCookie mycookie mycookie Value value1 Case sensitivity mycookie Expire
  • C语言中的array、&array、&array[0]有什么区别? [复制]

    这个问题在这里已经有答案了 在学习C语言中的数组和指针时 我很困惑 为什么ch ch ch 0 彼此相等 而sptr sptr sptr 0 却不相等 这是我的源代码 int main void char ch 7 1 2 3 4 5 6
  • 访问结构向量

    我有一个结构 struct OutputStore int myINT string mySTRING 如果我创建一个 OutputStore 类型的数组 如下所示 OutputStore OutputFileData new Output
  • 通过 MVC 将数据写入数据库的最佳方法是什么?

    我正在使用 MVC 和 EF Core 开发一个家庭作业项目 我正在寻找将数据写入数据库的最佳方法 我是初学者 有两张桌子 Predbilje ba 报名 和Seminari 研讨会 public class Predbilje ba Ke
  • 为什么 C++ 元组如此奇怪?

    我通常创建自定义structs将不同类型的值分组在一起时 这通常很好 而且我个人发现命名成员访问更容易阅读 但我想创建一个更通用的 API 在其他语言中广泛使用元组后 我想返回类型的值std tuple但发现它们在 C 中使用比在其他语言中
  • 我们可以使用 C# 录制发送到扬声器的声音吗

    我有一个软件 SoundTap Streaming Audio Recorder 它记录发送到扬声器的任何音频 无论流是来自网络还是来自某些文件或麦克风 我可以在桌面应用程序中制作这样的应用程序 以便我可以录制发送到扬声器的流 无论来源如何
  • 将 .NET 类库(主要定义 CRUD 操作)公开为服务

    公开现有内容的最佳 有效和最快的方法是什么 类 图书馆 主要定义 CRUD 操作 作为service 周转基金服务 or WCF数据服务 以便它可以与银光 or Ajax 在那儿tools 代码生成器 RAD 工具 哪些可以支持这个 预先感
  • 在 Visual Studio C++ 资源编辑器中导入 png 文件

    我希望能够在 Visual Studio 资源编辑器中导入 png 文件 以便能够在不同的其他项目中使用嵌入的资源 有解决办法吗 我知道它适用于位图 但我对 png 感兴趣 因为即使在较低格式 16x16 或 32x32 上也可以使用 透明
  • 当前线程中的单例

    我的单身人士如下 public class CurrentSingleton private static CurrentSingleton uniqueInstance null private static object syncRoo
  • 我应该为每个 Web 请求使用静态缓存的 ResourceManager 还是一个新实例?有关系吗?

    创建新的 NET 对性能 或其他 有何影响 如果有 ResourceManager根据每个请求new ResourceManger myResourceType FullName myResourceType Assembly 与在 Des
  • 如何使用 __m128i 执行元素左移?

    我发现 SSE 移位指令只能在所有元素上移位相同的量 mm sll epi32 mm slli epi32 这些会移动所有元素 但移动量相同 http software intel com sites products documentat

随机推荐

  • Python 命名元组的可变默认参数

    我发现了一种让命名元组使用默认参数的巧妙方法here https stackoverflow com a 18348004 2529619 from collections import namedtuple Node namedtuple
  • SKPhysicsContact有什么方法可以确定A和B哪个物体?

    在 SpriteKit 中 我们在 didBeginContact 方法中检测到 但这看起来有点愚蠢做这样的事情 func didBeginContact 联系人 SKPhysicsContact if let contactA conta
  • 在没有图形环境的Linux下运行Matlab?

    我将使用 SSH 在远程 Linux 服务器上运行 Matlab 程序 我想知道如何在Linux中仅使用命令行运行Matlab 这意味着没有图形环境 Thanks 使用以下标志启动 MatLab matlab nodesktop nojvm
  • 自动工具和 -Wl,-whole-archive

    是否可以告诉自动工具使用 Wl whole archive 标志链接库之一 生成文件 am bin PROGRAMS pktanon pktanon SOURCES main cpp pktanon DEPENDENCIES lib LIB
  • JOIN 语句中的 CodeIgniter ActiveRecord 字段名称

    我正在构建一个涉及 JOIN 的查询 这是我第一次使用 Active Record 进行数据库操作 但遇到了一些障碍 我想加入一个名为companies to the users表 这样我就可以获取用户所在的公司名称等 我已经成功地完成了这
  • 如何从xpath表达式获取真实的节点顺序(java)

    如果我有一个使用的 XPath 表达式preceding sibling 我得到NodeList顺序不正确 我怎样才能得到正确的订单 例子
  • 通过 JNI 高效传递大型 C 结构

    我有一个大型 C 结构 大约 40 个成员 int 和 char 我必须将其通过 JNI 传递到 Java 端以进行进一步处理 这种情况反复发生 我已经把GetMethodID 等进入init 函数在 C 端 所以我只需调用它们一次 什么是
  • 带重音符号的 MailMessage 附件文件名

    我正在尝试发送带有附加 Excel 文件名的 HTML 电子邮件 一切都运行良好 直到我需要发送附件名称包含重音字母的邮件 我尝试过的每个解决方法都惨败 原始代码 var attachment new Attachment new Memo
  • Java 浮点除法的显式类型转换

    我不确定选项 4 除法 中的浮点除法是否使用显式类型转换 我需要一些帮助来理解什么是浮点除法 我必须使用整数来存储 2 个操作数 使用双精度数来存储结果 您必须对选项 4 中的浮点除法使用显式类型转换 还可以使用 switch 语句来处理菜
  • 如何从 Asp.Net Core 视图组件返回错误的 HTTP 状态代码

    我试图从 Asp Net Core 中的视图组件返回 HTTP 500 或 BadRequest 结果 但是此返回类型似乎不适用于视图组件 状态代码返回类型是否可用于视图组件 或者我的设计是否错误 我正在通过 ajax 调用我的控制器操作
  • 将 VLOOKUP 结果连接到 Google 表格中的一个字符串中

    我的 Google 电子表格有以下任务 在某个 id 右侧的所有单元格中加入字符串 用不同的方式表述 SELECT A JOIN B GROUP BY A WHERE A myid 如果 JOIN 是一个聚合函数 或者换句话说 JOIN V
  • C++ 在循环中实例化模板

    我有一个工厂类 它需要实例化几个带有连续模板参数的模板 这些模板参数是简单的整数 如何在不展开整个循环的情况下实例化此类模板函数 唯一能想到的就是使用boost预处理器 您能推荐其他不依赖于预处理器的东西吗 thanks 模板参数必须是编译
  • 如何从命令行启用“std=c++0x”?

    我试图生成遵循离散分布的随机数 并找到了此链接 http www cplusplus com reference random discrete distribution http www cplusplus com reference r
  • 如何从列表视图上的所选项目中提取文本

    我有一个包含一些项目的列表视图 我想从所选项目中获取文本 这是我的列表适配器和 onItemClickListener ListView lv ListView findViewById R id listView1 lv setAdapt
  • 异常消息是在数据上下文类型上有一个顶级 IQueryable 属性,其元素类型不是实体类型

    我正在构建一个托管在 IIS 7 中的 WCFDataService 我将使用 Reflection Provider 作为数据源提供程序 如果我将实体类型定义保留在定义服务的同一程序集中 我的项目可以工作 但如果我将实体类型移动到另一个引
  • iOS应用程序需要arm64吗?

    我将我的应用程序上传到 Xcode 其中显示构建需要 arm64 这不包括 iPhone 5 5c 及更低版本使用该应用程序 但是 我希望 iPhone 5 5c 能够使用该应用程序 并且一定错误地要求了 arm64 我认为它一定是 inf
  • 如何使应用程序受 Outlook 信任

    我创建了一个正在阅读 Outlook 邮件的应用程序 但是当用户在系统中安装该应用程序并运行它时 Outlook 中会弹出 某些外部应用程序想要访问您的 Outlook 您要授予访问权限吗 如何使我的应用程序受 Outlook 信任 一种方
  • 我应该在渲染到 HTML5 画布之前剔除元素还是让画布剔除

    我应该在调用画布绘制方法之前剔除元素还是让画布处理剔除 我应该实现如下逻辑 if circle x circle radius gt 0 circle x circle radius
  • 准备好的语句删除前导零[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我试图在我的数据库中输入一个电话号码 该列设置为 varchar 15 并且在 phpMyAdmin 中它将接受一个以 0 开头的电话号码
  • C 中管道命令的问题

    我正在尝试用 C 语言为 Unix 创建一个简单的 shell 我已经能够完成所有命令的解析和执行 但我遇到了管道问题 我认为问题在于我没有连接到正确的管道来输入第二个命令 例如 如果我输入 ls wc 它会在 wc 命令之后暂停 我认为这