【问题标题】:C - directing IO to a pipe and then restoring it back to the consoleC - 将 IO 定向到管道,然后将其恢复回控制台
【发布时间】:2016-03-03 11:23:43
【问题描述】:

上下文:我正在构建一个 UNIX shell,目前正在实现管道。

目标: 由管道分隔的调用将输出从一个传递到另一个,只打印最终输出。

症状:最后一个进程继续输出到管道中,因此我什么也看不到,也不知道它是否正确执行,接收到前一个进程的输出作为输入等。

诊断是否可以随意在管道和控制台之间切换输出:我只是创建管道,将其引导到其中,然后返回到控制台,然后再继续执行前面的代码execvp() 调用(即它无论如何都应该被打印)以查看它是否回到终端上。

我测试的代码:

#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "unistd.h"
#include "errno.h"
#include <sys/wait.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <signal.h>

//all the #includes I've got in the original project

int main(int argc, char* argv[])
{
    int fp[2];
    pipe(fp);

    int saved_fd_0, saved_fd_1;

    saved_fd_0 = dup2(fp[0], 0);
    saved_fd_1 = dup2(fp[1], 1);
    dup2(saved_fd_1, 1);
    dup2(saved_fd_0, 0);
    close(fp[0]);
    close(fp[1]);

    printf("output is at terminal");
}

我根据this answer 选择了这个序列,但它无法打印超出这段代码的任何内容。不幸的是,我发现的类似问题通常归结为 fflush() 调用,或者不关心将输出恢复到终端(即,我不只是问而不做任何研究)。

非常感谢。

我正在使用ls | wc 作为输入进行测试。

【问题讨论】:

  • 请向我们展示您的代码。不看代码就很难看出哪里出了问题。
  • 问题出在我在问题中编写的代码中,其他所有功能都按预期运行。项目中没有其他与管道/IO 相关的代码(除了管道(函数和整数声明))。
  • "最后一个进程继续输出到管道中"你的意思是ls | wc中的第一个进程?
  • 我的意思是wc 进程。为了避免对 execs 周围的代码产生任何依赖,我只运行将输出设置到管道并返回到终端的代码,中间没有任何其他内容,所以我可以简单地查看输出是否返回到终端。跨度>
  • @user3079666 不,不是。请向我们展示您的其余代码,或者更好的是,提供minimal reproducible example,以便我们通过在自己的计算机上观察来了解您的问题。

标签: c linux terminal pipe


【解决方案1】:

你确实搜索好了,上面的代码几乎没有任何用处。 听起来像科尔。项目,所以这里有一些提示

  1. 一个命令行上可以出现多个管道

  2. 您只需要管道就可以让它工作(图表可以提供帮助)

【讨论】:

  • 请拼写。另外,我看不出你的回答是如何回答这个问题的。
  • 上面的代码是某种单元测试,它是为了专门检查我是否可以在将输出引导到管道后恢复到终端。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-13
  • 2015-04-20
  • 1970-01-01
  • 2013-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多