c - 没有结果!!使用 fork() 使用 dup2 运行带有 2 个管道的 execlp()

标签 c linux exec fork pipe

我正在编写一个 C 程序,它将运行 Linux 命令,例如:
cat /etc/passwd | grep list | cut -c 1-5
我没有任何结果
*这里父进程等待第一个子进程(child_pid)完成;
第一个子进程等待第二个子进程(pfils)!!
有什么想法吗?
代码:

main()
{
    pid_t child_pid;
    int fd[2];
    int pfd[2];
    pipe(pfd);
    child_pid = fork ();

    if (child_pid != 0) 
    {
        wait(child_pid);
        close(pfd[1]);
        dup2(pfd[0],0);
        close(pfd[0]);
        execlp("cut","cut","-c","1-5",NULL);
    }
    else
    {
        pid_t pfils = fork();
        pipe(fd);

        if(pfils == 0)
        {
            close(fd[0]);
            dup2(fd[1],1);
            close(fd[1]);
            execlp("cat", "cat","/etc/passwd",NULL);
        }
        else
        {
            wait(pfils);
            close(fd[1]);
            dup2(fd[0],0);
            close(fd[0]);
            close(pfd[0]);
            dup2(pfd[1],1);
            close(pfd[1]);
            execlp("grep","grep","list",NULL);
        }
    }
}

最佳答案

    pid_t pfils = fork();
    pipe(fd);

Fork 将复制该进程。进程的独立副本。因此,如果您在 fork 之后调用管道,则进程的每个副本都会获得自己的管道。将 pipeline() 放在 fork() 之前,它应该可以工作。

关于c - 没有结果!!使用 fork() 使用 dup2 运行带有 2 个管道的 execlp(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14290129/

相关文章:

c - 将字符串指针传递给 lua

c - 如何将 execvp 结果作为字符串存储在 char 数组中

Linux 找不到 metis.h

linux - 在查找和移动 Bash 脚本中包含具有相同名称的不同文件

c - strcpy 与 memcpy

我的C套接字编程函数中connect不成功

c - 核心文件的 gdb 回溯打印错误 "no such file or directory"

c++ - C 系统调用 pipe、fork 和 execl

php - 在后台centos服务器运行php脚本

Linux - 将部分输出重定向到文件