【问题标题】:Trying to implement unnamed pipe program in Ubuntu尝试在 Ubuntu 中实现未命名的管道程序
【发布时间】:2023-04-07 15:16:02
【问题描述】:

我正在尝试制作一个模拟未命名管道的程序,就像在 Ubuntu 的终端中所做的一样。该程序接收文件名和要为每个文件执行的命令。我想通过管道将程序的输入/输出串起来,这样第一个程序的输入将是 std.in,它的输出将是第二个程序的输入,依此类推。到目前为止,这是我所拥有的:

void np_exec(char* cmd, char** argv)
{


    while(*(++argv) != NULL)
    {
            int pid = fork(); //parent executes
            if(pid < 0)
            {
                    printf("Error forking")
                    exit(1);
            }

            if(pid != 0) // parent
                    if (execvp(cmd, *argv) == -1)
                            perror("execvp failed");

                    //somewhere here i want to pipe input to output

    }
}

int main(int argc, char** argv)
{
    assert(strcmp(argv[argc-1], "-"));

    int i;
    for (i = 1; i < argc; ++i) {
            if (!strcmp(argv[i], "-"))
            {
                    argv[i] = NULL;
                    np_exec(argv[1], &argv[1]);
                    argv = &argv[i];
                    argc -= i;
                    i = 0;
            }
    }

    char* args[argc];
    args[argc-1] = NULL;

    for (i = 1; i < argc; ++i) {
            args[i-1] = argv[i];
    }

    if (execvp(args[0], args) == -1)
            perror("execvp failed");
    return;
}
}

如您所见,我正在努力实现管道。另外,有没有办法测试这个程序是否有效?是否有写入文件的命令(然后有望继续到其他文件?)

【问题讨论】:

  • 你不应该做任何事情。只需从标准输入读取,写入标准输出,完成...$ app1 | app2 | app3 | etc...
  • 使用pipe()有什么问题?
  • Marc,我正在尝试用我自己的程序来实现这一点。伊格纳西奥,我在理解管道()的确切放置位置时遇到了一些麻烦。是在我 fork() 之后吗?如何将所有管道连接在一起?感谢您的帮助。
  • @Mat'sMug “如你所见,我正在为管道实现而苦苦挣扎。另外,有没有办法测试这个程序是否有效?” 表示它不属于 Code Review。请阅读Be careful when recommending Code Review to askers :)
  • @SimonAndréForsberg 我不推荐 CR,只是指出标签被滥用了。

标签: c linux ubuntu pipe


【解决方案1】:

已经有一篇文章解释了类似问题的解决方案: Using dup2 for piping

基本上,您将父母的标准输出连接到孩子的标准输入。

要进行测试,只需编写一个测试程序(您也可以在父进程中执行此操作),它使用 putchar() 将字符写入标准输出,另一个(用于子进程)使用 getchar() 从标准输入读取。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-21
    • 1970-01-01
    • 2011-02-08
    • 1970-01-01
    相关资源
    最近更新 更多