子进程的奇怪行为

2024-02-01

我有一个关于子进程行为的问题。这个测试程序的目的是运行Linux命令echo Hello | wc使用管道。

我的命令不起作用,结果调用了错误的 c 字符串。

预期输出是:

command 0
echo
command 1
wc

但是,我得到:

command 0
echo 
command 1
Hello

我只有在注释掉时才能得到预期的输出 execvp(),当子进程没有退出时。

这是测试函数:

int test(pid_t id[])
{
    int i;
    int pipefd[2];

    char *cat_args[] = {"echo","Hello", NULL};
    char *grep_args[] = {"wc", NULL};
    char **arr[] = {cat_args,grep_args};

    // make a pipe 
    pipe(pipefd);

    for(i = 0; i < 2; i++){
        id[i] = fork();

        if (id[i] == -1){
            printf("Unable to create child process");
            fprintf(stderr,"fork() failed to spawn child process");
            exit(1);
        }
        else if (id[i] == 0){
            printf("command ");
            printf("%d\n",i);
            
            if (i == 0){
                dup2(pipefd[0],STDIN_FILENO);
            }
            else if (i == 1){
                dup2(pipefd[1],STDOUT_FILENO);
            }
            // Close pipes for child processes
            close(pipefd[0]);
            close(pipefd[1]);

            printf("%s\n",*arr[i]);
            //To simply and simulate problem, can replace execvp() with exit(0);
            execvp(*arr[i],arr[i]);
        }
    }
    // Close pipes of parent process    close(pipefd[0]);
    close(pipefd[1]);
    return 0;
}

这是主要功能:

int main(int argc, char **argv)
{ 
    pid_t id[2];
    test(id);

    int status;
    
    waitpid(id[0],&status,0); 
    waitpid(id[1],&status,0); 
    return 0;
}

printf写入标准输出,所以它受到你的影响dup2(pipefd[1],STDOUT_FILENO);,因此进入管道而不是屏幕上。

您应该将诊断消息写入 stderr:

fprintf(stderr, "%s\n", *arr[i]);

你看到的原因Hello这是你的反向管道的输出。

wc | echo Hello

如果你想展示wc output 1 1 6,你应该翻转它们。

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

子进程的奇怪行为 的相关文章

随机推荐

  • 构建器模式和大量强制参数

    迄今为止我使用的是下列的 http rwhansen blogspot com 2007 07 theres builder pattern that joshua html构建器模式的实现 与描述的实现相反 here http en wi
  • 如何知道哪个应用程序正在读取或写入文件

    Android 或 Android NDK 中是否有任何方法可以知道哪个应用程序正在磁盘或设备内存上读取或写入数据 您可以在输出中查找您的文件 ls l proc fd 为此 您不需要任何特殊工具或根 解释 每个正在运行的进程都有一个条目
  • Lotus Notes 使用 Java api 按日期搜索

    我试图从 Lotus Notes 数据库中按日期选择记录 但在正确设置日期格式方面遇到了麻烦 这是相关代码 public void runNotes Session s try s NotesFactory createSession St
  • 为什么我会得到负值位移的奇怪结果?

    这个问题不是重复的这个问题 https stackoverflow com questions 1857928 right shifting negative numbers in c 我遇到过一种情况 我可能必须将 正 数字左移负值 即
  • 根据查找表替换数据框中的值

    我在替换数据框中的值时遇到一些问题 我想根据单独的表替换值 下面是我正在尝试做的事情的一个例子 我有一张表 其中每一行都是客户 每一列都是他们购买的动物 我们称这个数据框为table gt table P1 P2 P3 1 cat liza
  • 无法将“cv::VideoCapture”转换为“CvCapture*”

    我有一个简单的程序 可以拍摄视频并播放它 尽管它对视频进行了一些图像处理 可以从对话框结果中检索视频 也可以直接通过给出文件路径来检索视频 当我使用CV CvCapture 捕获1 我得到像 capture1 isOpen 这样的属性 ca
  • RequireJS:如何将变量从一个文件传递到另一个文件?

    我将 require 与骨干 骨干形式一起使用 我目前正在使用 RequireJS 将代码分成多个文件 我将模型存储在单独的文件中 并希望单独保留表单验证器 但是 我无法访问一个文件以及依赖于该文件的另一个文件中定义的变量 我得到的是Unc
  • 如何国际化delphi应用程序[重复]

    这个问题在这里已经有答案了 可能的重复 翻译申请 https stackoverflow com questions 12311926 translate application 国际化用 delphi xe2 编写的应用程序的最佳方法是什
  • 执行长字传输到 CPU 需要多少个周期和大小

    该任务针对架构 ColdFire 处理器 MCF5271 我不明白执行到 CPU 的长字传输或字传输需要多少个周期以及什么大小的周期 我正在阅读图表 但不明白其中有何联系 非常感谢任何评论 我附上了两个例子和答案 数据总线大小 https
  • 从文件名获取目录名

    我有一个文件名 C folder foo txt 并且我需要检索文件夹名称 C folder 在 C 中 在 C 中我会做这样的事情 string folder new FileInfo C folder foo txt Directory
  • 在 RMarkdown 中的标题页后插入空白页

    我试图在我的 RMarkdown 文档 pdf 输出 的标题页和目录之间插入空白页 我遵循了所描述的建议here https stackoverflow com questions 28962651 inserting title page
  • 数组的随机打乱

    我需要随机洗牌以下数组 int solutionArray 1 2 3 4 5 6 6 5 4 3 2 1 有什么功能可以做到这一点吗 使用集合来打乱原始类型数组有点过分了 自己实现该功能非常简单 例如使用费舍尔 耶茨洗牌 http en
  • 如何在 Apache httpclient 中使用指数退避策略?

    The docs https hc apache org httpcomponents client dev httpclient cache apidocs org apache http impl client cache Expone
  • 即使我使用 Content-Disposition: inline,PHP 也会强制下载 PDF 文件

    如果可能的话 我正在尝试在浏览器中显示 PDF 而且我知道我可以在 Chrome 中执行此操作 这就是我正在测试的版本 问题是 每次我尝试时 它都会提示下载 我正在使用 PHP 会话 所以我知道发送了一些无关的标头 所以我调用header
  • 使用 System.IO.Ports.SerialPort 类打开串行端口时出错

    我正在尝试使用 System IO Ports SerialPort 类打开并读取串行端口 我将串行端口从工具窗格 Visual Studio 2008 拖到我的 Windows 窗体应用程序上 我已经设置了属性网格 因此我可以在运行时轻松
  • Flutter:如何防止设备方向改变并强制纵向?

    我想阻止我的应用程序改变其方向并强制布局坚持 纵向 在 main dart 中 我放置了 void main SystemChrome setPreferredOrientations DeviceOrientation portraitU
  • 如何在 JVM 上确定任意格式(JPEG、PNG 等)图像文件的尺寸?

    我想浏览一个目录并挑选出所有图像 然后根据它们的尺寸执行一些操作 有哪些库可供我执行此操作 我正在 Clojure 中工作 但 JVM 上可用的任何东西都是公平的 提前致谢 with open r java io FileInputStre
  • 释放 malloc 失败

    我有这样的东西 char temp xyz temp char malloc sizeof somestring xyz char malloc sizeof temp xyz strrchar temp temp does not con
  • 将图像上传到 firebase 实时数据库或存储?

    我正在尝试将图像与其他字符串和双精度数据类型一起上传到 firebase 我现在想到两个选项 一个是将图像 Url 上传到 firebase 实时数据库 当我检索它时 我将检索图像 Url 并将其转换为图像 另一种方法是将图像文件上传到 F
  • 子进程的奇怪行为

    我有一个关于子进程行为的问题 这个测试程序的目的是运行Linux命令echo Hello wc使用管道 我的命令不起作用 结果调用了错误的 c 字符串 预期输出是 command 0 echo command 1 wc 但是 我得到 com