如何使用管道运行命令?

2024-02-11

我正在尝试使用 execvp 运行 ls|wc 。所以我创建了一个管道,然后创建了一个子管道。我关闭父/子中适当的(读/写)端,然后将另一端映射到标准输出/标准输入。然后我在父级中使用 execvp 运行 ls ,在子级中使用 wc 。当我运行程序时它说

 wc:standard input:bad file descriptor.
 0 0 0
 wc: -:Bad file descriptor

这是我的代码:

int main()
{
//int nbBytes = 0; //stream length
int pfd_1[2]; //file descriptor 
//char buffer[MAX_FILE_LENGTH]; 
char* arg[MAX_FILE_LENGTH];
pid_t processPid;

//Create a pipe

if(pipe(pfd_1) == -1)
{
    printf("Error in creating pipe");
    return 0;
}

//Create a child
processPid = fork();

if(processPid == -1)
{
    printf("Erro in fork");
    exit(1);
}   
else if(processPid == 0) //Child
{               
    //redirect read end file descriptor to standard input
    dup2(pfd_1[0],0);
    //Close the write end
    if(close(pfd_1[1] == -1))
    {
        printf("Error in closing the write end file descriptor");
        exit(1);
    }
    arg[0] = "wc";
    //arg[1] = "-l";
    arg[1] = '\0';

    if(execvp(arg[0],arg) == -1)
    {
        printf("Error in executing ls");
    }       

}
else //Parent
{               
    //redirect standard output to the file descriptor
    dup2(pfd_1[1],1);
    //Close the read end
    if(close(pfd_1[0] == -1))
    {
        printf("Error in closing the read end from parent");
        exit(1);
    }
    //Command 
    arg[0] = "ls";
    arg[1] = "/proc/1/status";
    arg[2] = '\0';

    if(execvp(arg[0],arg) == -1)
    {
        printf("Error in executing ls");
    }       
}

}

知道可能出了什么问题吗?为什么它会将标准输入视为错误的文件描述符?我的理解是,由于 stdin 和读取结束文件描述符是别名,因此 wc -l 会读取来自父进程的任何输出。我需要执行 scanf 才能从标准输入读取吗?


问题出在这一行:

if(close(pfd_1[1] == -1))

您正在关闭以下结果pfd_1[1] == -1,这必然等于0(因为它们永远不会相等)。正确的行可能是:

if (close(pfd_1[1]) == -1)

请注意,您稍后会在尝试关闭父进程中的读取端时再次执行此操作。

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

如何使用管道运行命令? 的相关文章

随机推荐

  • AccessibilityNodeInfo - 发送文本

    我正在开发一个 Android 应用程序 我必须将文本发送到焦点EditText其他应用领域 我已经做到了API level 18及以上使用AccessibilityService 当我找到EditText 我从剪贴板粘贴数据 这是代码 p
  • 需要在多维数组中查找或计算重复项

    我需要计算多维数组中重复项的数量 并在发现重复项时发出警报 Arr 2 sk 3 df 7 uz 3 df 7 gh 建议 计数可以通过这种方式完成 如果 arr 0 位置等于下一个即将到来的位置 那么它必须给出一个计数并需要检查两个值组合
  • 将 socket.io 与 redux 结合使用

    这是我第一次使用socket io在生产中 我在用React Redux 我最近集成了socket io使用 redux 及其工作正常 但我不确定这是否是实现我所做的事情的最佳方法 因为我还没有找到带有 redux 的 socket io
  • 使用 XObject 包含外部图像的 PDF

    我正在尝试构建一个带有外部文件链接的 PDF 文件 我正在使用规范https www adobe com content dam Adobe en devnet acrobat pdfs pdf reference 1 7 pdf http
  • VSCode 远程容器 - 错误:ENOSPC:设备上没有剩余空间

    我一直在使用VSCode 远程容器插件 https marketplace visualstudio com items itemName ms vscode remote remote containers一段时间没有问题 但是今天 当我
  • Python运行时:重新编译和重用C库

    我正在开发一个用于用户定义函数的数值分析的工具 这个想法是用 Python 制作一个方便的 UI 用户可以在其中输入 C 函数 然后按下按钮 并接收一些输出数据 计算可能需要几分钟或几小时 因此仅使用 Numpy 的性能是不可接受的 我尝试
  • 确定android CPU速度?

    我的一位朋友从事手机游戏开发 那么他面临的问题是这样的 在他的游戏中 一些 root 的手机用户能够获得非常高的分数 这是完全不可能的 除非 Android 设备的 CPU 或系统时钟速度很慢 情况就是如此 这些用户使用一些第三方应用程序
  • PyQt5 按钮未连接

    我正在尝试使用 PyQT5 构建一个简单的 GUI 其中有 3 个按钮用于打开文件浏览器 还有一个按钮用于对所选文件进行处理 但我无法让按钮连接到执行此操作所需的功能 In the Ctrl类 该 connect signals函数似乎没有
  • 如何使用字符串值获取 NSArray 中对象的索引?

    我想获取类别 NSMutableArray 中对象的索引 类别对象有一个属性 category title 我希望能够通过传递category title 的值来获取索引 我浏览了文档 找不到解决此问题的简单方法 NSArray不保证您只能
  • C++11 变量缩小,没有 GCC 编译器警告

    缩小范围的概念似乎非常简单 但是 有人可以解释一下为什么下面的某些代码会导致 缩小 编译器错误而其他代码则不会 此代码会按预期产生错误 constexpr int a 255 unsigned char b a OK unsigned ch
  • 这种生产者/消费者实现有什么问题?

    所以我正在考虑在 C 中使用简单的生产者 消费者队列 我最终将使用 boost 进行线程处理 但此示例仅使用 pthreads 我最终还将使用一种更加面向对象的方法 但我认为这会掩盖我目前感兴趣的细节 无论如何 我担心的具体问题是 由于此代
  • 如何获取循环发送的每条短信的发送报告android?

    我正在开发短信应用程序 我需要循环发送短信 注册了 SENT 和 DELIVERED 状态的广播接收器 但问题是如何区分哪个送达通知是针对我发送的哪条短信 我正在使用 SMSMANAGER 类发送短信 我的问题与这里讨论的类似 如何监控每条
  • Python 在 Windows 7 上启动非常慢

    在我的 Windows 7 计算机上加载 Python 所需的时间比在虚拟机 在 Windows 内部相同硬件上 上运行的 Ubuntu 14 04 长 17 倍 Anaconda3发行版在Windows和Ubuntu上使用默认的pytho
  • 将图像添加到项目(旋转器)

    您好 我是 Android 爱好者 我想将图像添加到我的微调项目中 不幸的是 我不知道该怎么做 下面是我的 xml 文件和 MainActivity 谢谢阅读 XML FILE
  • 如何确定UIBarButtonItem在UIToolbar中的位置?

    确定 UIToolbar 中 UIBarButtonItem 的 x y 位置的最简单方法是什么 我找到的唯一答案是有什么方法可以知道 uibarbuttonitem 被绘制在哪里 http www cocoabuilder com arc
  • 如何在 jQuery 中编辑 CSS 规则?

    目的是动态地将行添加到表中 并且稍后手动应用规则不太好 而且更慢 具体的例子是我正在创建一个树表来表示文件夹目录 每个文件夹都是一个div 每一个div 有一个ul与li对于每列的信息 这些li有一个与列名相同的类名 这提供了列宽 但是我想
  • 在 bash 中解析 mobileprovision 文件?

    我正在构建一个 php bash mysql 系统 用于自动分配 iPhone 应用程序 但我想读取项目的 mobileprovision 文件中的应用程序标识符密钥 并据此更改它的 info plist 文件 如果 cfbundleide
  • C语言中printf函数是如何工作的?

    我在测试printf函数时遇到了一个问题 首先我写这样的代码 int main void char a a printf a f n a return 0 输出是 然后我写代码 int main void float b a printf
  • PHP 大括号,这段代码的含义是什么

    我有这段代码 用于从数据库获取查询 在MyBB http www mybb com来源 query SELECT fields FROM this gt table prefix table 我的问题是 什么意思 table table 和
  • 如何使用管道运行命令?

    我正在尝试使用 execvp 运行 ls wc 所以我创建了一个管道 然后创建了一个子管道 我关闭父 子中适当的 读 写 端 然后将另一端映射到标准输出 标准输入 然后我在父级中使用 execvp 运行 ls 在子级中使用 wc 当我运行程