上下文:我正在构建一个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作为输入进行测试。

最佳答案

你搜索得很好,上面的代码几乎没什么用处。
听起来像科尔。项目,这里有一些提示
一个命令行上可以出现多个管道
管道是使其工作所需的一切(图表可以帮助)

09-25 22:19
查看更多