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 管道重定向问题 的相关文章

随机推荐

  • 静态变量和方法

    我遇到一个这样设置的类 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的标准输入 同样 读取它的输出 将其打印到终端