Fork-exec 管道重定向问题

2023-12-19

谁能告诉我这段代码有什么问题吗?

总之,它创建输入和输出管道,而 fork-exec 的sort程序。家长读字典/usr/share/dict/words并将其写入管道dup2()'d to sort的标准输入,同样,读取它的输出,将其打印到终端(父级的标准输出)。或者,至少,这就是应该发生的事情。

回溯表明父进程挂在read()第 130 行(标有注释“XXX”)。几乎就像sort不知道文件结尾,但关闭了写结尾pipeIn应该“发出信号”,对吧?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

int main(int argc, char** argv)
{
    int pipeIn[2];
    int pipeOut[2];

    if ((pipe(pipeIn)) == -1)
    {
        perror("pipe");
        exit(EXIT_FAILURE);
    }

    if ((pipe(pipeOut)) == -1)
    {
        perror("pipe");
        exit(EXIT_FAILURE);
    }

    pid_t child = fork();

    if (child == 0)
    {
        // This is child!

        if ((dup2(pipeIn[0], STDIN_FILENO)) == -1)
        {
            perror("dup2");
            exit(EXIT_FAILURE);
        }

        if ((dup2(pipeOut[1], STDOUT_FILENO)) == -1)
        {
            perror("dup2");
            exit(EXIT_FAILURE);
        }

        if ((dup2(pipeOut[1], STDERR_FILENO)) == -1)
        {
            perror("dup2");
            exit(EXIT_FAILURE);
        }

        if ((close(pipeIn[0])) == -1)
        {
            perror("close");
            exit(EXIT_FAILURE);
        }

        if ((close(pipeOut[1])) == -1)
        {
            perror("close");
            exit(EXIT_FAILURE);
        }

        if ((execlp("sort", "-r", NULL)) == -1)
        {
            perror("execlp");
            exit(EXIT_FAILURE);
        }
    }
    else if (child == -1)
    {
        perror("fork");
        exit(EXIT_FAILURE);
    }
    else
    {
        // This is parent!

        if ((close(pipeIn[0])) == -1)
        {
            perror("close");
            exit(EXIT_FAILURE);
        }

        if ((close(pipeOut[1])) == -1)
        {
            perror("close");
            exit(EXIT_FAILURE);
        }

        int dict = open("/usr/share/dict/words", O_RDONLY);

        if (dict == -1)
        {
            perror("open");
            exit(EXIT_FAILURE);
        }

        char buf[1024];
        int count;

        while ((count = read(dict, buf, sizeof(char) * 1024)) > 0)
        {
            putchar('.');

            if ((write(pipeIn[1], buf, count)) == -1)
            {
                perror("write 1");
                exit(EXIT_FAILURE);
            }
        }

        if (count == -1)
        {
            perror("read");
            exit(EXIT_FAILURE);
        }

        if ((close(dict)) == -1)
        {
            perror("close");
            exit(EXIT_FAILURE);
        }

        if ((close(pipeIn[1])) == -1)
        {
            perror("close");
            exit(EXIT_FAILURE);
        }

        while ((count = read(pipeOut[0], buf, sizeof(char) * 1024)) > 0) // XXX
        {
            putchar('!');

            if ((write(STDOUT_FILENO, buf, count)) == -1)
            {
                perror("write 2");
                exit(EXIT_FAILURE);
            }
        }

        if (count == -1)
        {
            perror("read");
            exit(EXIT_FAILURE);
        }

        if ((close(pipeOut[0])) == -1)
        {
            perror("close");
            exit(EXIT_FAILURE);
        }
    }

    return EXIT_SUCCESS;
}

感谢您的任何意见(请原谅双关语)。


您的问题是您没有在智利过程中关闭管道未使用的末端。所以你需要在之前的某个地方添加以下代码exec

    if ((close(pipeIn[1])) == -1)
    {
        perror("close");
        exit(EXIT_FAILURE);
    }

    if ((close(pipeOut[0])) == -1)
    {
        perror("close");
        exit(EXIT_FAILURE);
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Fork-exec 管道重定向问题 的相关文章

  • 使用 Unity 在构造函数中使用属性依赖注入

    好的 我在基类中定义了一个依赖属性 我尝试在其派生类的构造函数内部使用它 但这不起作用 该属性显示为 null Unity 在使用 container Resolve 解析实例后解析依赖属性 我的另一种选择是将 IUnityContaine
  • 使用Physics.Raycast 和Physics2D.Raycast 检测对象上的点击

    我的场景中有一个空的游戏对象 带有 2D 组件盒碰撞器 我将脚本附加到该游戏对象 void OnMouseDown Debug Log clic 但是当我点击我的游戏对象时 没有任何效果 你有什么想法 如何检测我的盒子碰撞器上的点击 使用光
  • Bash:将输出传输到后台进程?

    我想将一个进程放入后台 然后多次将数据传递给它 例如 cat The command I want to write into cat pid Getting the process id of the cat process echo h
  • 如何将 #ifdef DEBUG 添加到 Xcode?

    我的项目中有一些代码永远不应该在发布版本中使用 但在测试时很有用 我想做这样的事情 ifdef DEBUG Run my debugging only code endif 在 Xcode 4 中哪里添加 DEBUG 设置 我尝试将其放入
  • 关于在 Windows 上使用 WiFi Direct Api?

    我目前正在开发一个应用程序 我需要在其中创建链接 阅读 无线网络连接 在桌面应用程序 在 Windows 10 上 和平板电脑 Android 但无关紧要 之间 工作流程 按钮 gt 如果需要提升权限 gt 创建类似托管网络的 WiFi 网
  • 如何在 Linq 中获得左外连接?

    我的数据库中有两个表 如下所示 顾客 C ID city 1 Dhaka 2 New york 3 London 个人信息 P ID C ID Field value 1 1 First Name Nasir 2 1 Last Name U
  • 未经许可更改内存值

    我有一个二维数组 当我第一次打印数组的数据时 日期打印正确 但其他时候 array last i 的数据从 i 0 到 last 1 显然是一个逻辑错误 但我不明白原因 因为我复制并粘贴了 for 语句 那么 C 更改数据吗 I use g
  • C++:.bmp 到文件中的字节数组

    是的 我已经解决了与此相关的其他问题 但我发现它们没有太大帮助 他们提供了一些帮助 但我仍然有点困惑 所以这是我需要做的 我们有一个 132x65 的屏幕 我有一个 132x65 的 bmp 我想遍历 bmp 并将其分成小的 1x8 列以获
  • 批量更新 SQL Server C#

    我有一个 270k 行的数据库 带有主键mid和一个名为value 我有一个包含中值和值的文本文件 现在我想更新表格 以便将每个值分配给正确的中间值 我当前的方法是从 C 读取文本文件 并为我读取的每一行更新表中的一行 必须有更快的方法来做
  • Linux 堆栈大小

    我正在寻找 Linux 内核中堆栈的良好描述 但我发现找到任何有用的东西出奇地困难 我知道大多数系统的堆栈限制为 4k 而其他系统则限制为 8k 我假设每个内核线程 下半部分都有自己的堆栈 我还听说 如果中断发生 它会使用当前线程的堆栈 但
  • 使用 Moq 使用内部构造函数模拟类型

    我正在尝试模拟 Microsoft Sync Framework 中的一个类 它只有一个内部构造函数 当我尝试以下操作时 var fullEnumerationContextMock new Mock
  • 如何使用 Mongodb C# 驱动程序连接多个集合

    我需要将 3 个集合与多个集合合并在一起 lookup我在 C 驱动程序中尝试过 它允许我 lookup用户采集但无法执行秒 lookup用于设置集合 有人可以帮忙吗 db Transactions aggregate lookup fro
  • 私有模板函数

    我有一堂课 C h class C private template
  • .NET中的LinkedList是循环链表吗?

    我需要一个循环链表 所以我想知道是否LinkedList是循环链表吗 每当您想要移动列表中的 下一个 块时 以循环方式使用它的快速解决方案 current current Next current List First 电流在哪里Linke
  • (de)从 CSV 序列化为对象(或者最好是类型对象的列表)

    我是一名 C 程序员 试图学习 C 似乎有一些内置的对象序列化 但我在这里有点不知所措 我被要求将测试数据从 CSV 文件加载到对象集合中 CSV 比 xml 更受青睐 因为它更简单且更易于人类阅读 我们正在创建测试数据来运行单元测试 该集
  • C++ 密码屏蔽

    我正在编写一个代码来接收密码输入 下面是我的代码 程序运行良好 但问题是除了数字和字母字符之外的其他键也被读取 例如删除 插入等 我知道如何避免它吗 特q string pw char c while c 13 Loop until Ent
  • 用于 C# 的 TripleDES IV?

    所以当我说这样的话 TripleDES tripledes TripleDES Create Rfc2898DeriveBytes pdb new Rfc2898DeriveBytes password plain tripledes Ke
  • Server.MapPath - 给定的物理路径,预期的虚拟路径

    我正在使用这行代码 var files Directory GetFiles Server MapPath E ftproot sales 在文件夹中查找文件 但是我收到错误消息说 给定物理路径但虚拟路径 预期的 我对在 C 中使用 Sys
  • Linq-to-entities,在一个查询中获取结果+行数

    我已经看到了有关此事的多个问题 但它们已经有 2 年 或更长 的历史了 所以我想知道这方面是否有任何变化 基本思想是填充网格视图并创建自定义分页 所以 我还需要结果和行数 在 SQL 中 这将类似于 SELECT COUNT id Id N
  • 如何将 Roslyn 语义模型返回的类型符号名称与 Mono.Cecil 返回的类型符号名称相匹配?

    我有以下代码 var paramDeclType m semanticModel GetTypeInfo paramDecl Type Type Where paramDeclType ToString returns System Col

随机推荐

  • 静态变量和方法

    我遇到一个这样设置的类 public class MyClass private static boolean started false private MyClass public static void doSomething if
  • Flutter - 方法“map”被调用为空

    我在尝试使用对象模型从 api JSON 添加元素时收到以下错误DropdownMenuItem 这是错误 The method map was called on null Receiver null Tried calling map
  • 在 C# 中列出文件夹内的重复文件:利用 LINQ.AsParallel

    我已将以下算法写入 C 代码中 以递归方式列出文件夹内的文件 开始遍历目录及其子目录中的文件列表 将文件名和路径存储在列表中 如果当前文件与列表中的任何其他文件匹配 则在 将两个文件标记为重复 从列表中获取所有标记为重复的文件 按名称和返回
  • vuejs 中缺少 webpack 配置

    我的 vuejs 应用程序的 package json 看起来像 package json name vue app version 0 1 0 private true scripts serve vue cli service serv
  • FFmpeg 从 UYVY422 转换为 YUV420P

    我有 UYVY422 格式的原始视频 我想将其转换为 YUV420p 我正在执行该命令 ffmpeg y r 25 0 f rawvideo s 1920x1080 pix fmt uyvy422 i input avi pix fmt y
  • 创建 QName 时本地部分不能为“null”

    我们正在努力追踪一个错误 我们在日志中收到上述错误 谁能解释一下这条消息的含义吗 收到此消息有什么典型原因吗 堆栈跟踪是 org apache axiom om OMException java lang IllegalArgumentEx
  • 从 PowerPoint VBA 提取 OLEObject(XML 文档)

    我正在用 VBA 开发一个应用程序 用户窗体连接到读取 SPSS Statistics SAV 文件或 SPSS Dimensions MDD 文件的 COM 对象 该应用程序的一部分将元数据存储在 XML 文档中 以便我们稍后可以检索元数
  • 基于 If-Modified-Since 标头修改 REST API 表示是否有效?

    我想在我的 API 中实现 获取更改值 功能 例如 假设我有以下 REST API 调用 GET ws school 7 student 这得到了 7 学校的所有学生 不幸的是 这可能很多 因此 我想修改 API 以仅返回自特定时间以来已修
  • 为什么每次我运行/调试我的应用程序时,RubyMine 2.0.2 都会在不同的端口上启动 Webrick?

    每次我在 RubyMine 下启动 Rails 2 3 8 Web 应用程序时 它都使用不同的端口 这让我很生气 因为每次我想测试某些东西时都必须更改浏览器中的 URL 我找不到任何配置选项来更改它 任何人 这可能没有帮助 因为我使用的是
  • 当变量明确存在时,Javassist 没有这样的字段

    我正在尝试使用 javassist 将代码注入到 minecraft 1 8 jar 中 这insertBefore insertAfter方法工作得很好 但 insert at 方法并没有按预期工作 我收到此错误 https gist g
  • C strndup 隐式声明

    我正在尝试使用strndup函数 但我收到错误 错误 函数 strndup 的隐式声明 Werror 隐式函数声明 我四处搜索 发现它不是标准函数 因此我必须使用不同的标志进行编译 但是 我通过编译以下内容收到了同样的问题 std gnu1
  • 为孩子们建立安全的搜索引擎?

    我今年的项目 为孩子们建立安全的搜索引擎 所以我需要一些信息 1 在哪里可以找到有关该主题的一些研究 论文 2 如何利用开源工具 3 我的项目需要学习哪些技术 和一些建议请 thanks 更新 安全意味着当孩子们搜索任何内容时他们看不到相关
  • PHP 从数据库中下拉数据

    我正在尝试做一个select field根据我的数据库获取数据 所以 基本上 我希望它为我的数据库中的所有用户提供一个下拉菜单 所以就像而不是这样做
  • 导入错误:无法导入名称“keras”

    在 Jupyter 笔记本 python 中运行此命令时 import tensorflow as tf from tensorflow import keras 我收到此错误 ImportError cannot import name
  • C# 中的字符串将单引号替换为双引号

    如何在 C 字符串中用双引号 替换单引号 您需要对引号符号使用正确的转义序列 您可以找到有关转义序列的更多信息here http msdn microsoft com en us library h21280bw aspx String s
  • Android:应用程序关闭后将值保留在列表中

    我目前正在尝试开发一个用作购物清单的应用程序 用户在其中输入文本EditText 按Button 然后将该值保存到List 然后更新ListView以其价值 该应用程序运行良好 除非用户退出应用程序 在这种情况下 用户输入的所有值都不会保存
  • nginx.conf 中的 http 指令错误

    这就是我的 home ubuntu project nginx conf好像 http configuration of the server server the port your site will be served on list
  • 在 WPF Treeview 中搜索特定的 TreeViewItem

    我正在使用 wpfTreeView 我正在尝试搜索中的所有项目TreeView找到想要的TreeViewItem在其中 my code parent is a string我正在搜索的所需项目的标题 foreach TreeViewItem
  • ios 设置中缺少设备管理

    我正在尝试在 Xcode 中构建我的项目 它工作得很好 但最后我收到一条警告 验证您的帐户的开发者应用程序证书在您的设备上受信任 在 Artium 的 iPhone 上打开 设置 并导航至 常规 gt 设备管理 然后选择您的开发者应用程序证
  • Fork-exec 管道重定向问题

    谁能告诉我这段代码有什么问题吗 总之 它创建输入和输出管道 而 fork exec 的sort程序 家长读字典 usr share dict words并将其写入管道dup2 d to sort的标准输入 同样 读取它的输出 将其打印到终端