使用 dup2 命令重定向

问题描述

我知道这是一个简单的练习,但我遇到了麻烦。

 ps | sed 1d | wc -l

我正在尝试使用 c 代码为我的学校练习生成上述终端命令的输出。我编写了一个代码,将所有输入和输出重定向到所需的目的地,但我没有在控制台上获得任何输出,因为我没有在任何文件重定向最终输出,因此它必须显示在控制台上。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/file.h>  
#define READ 0
#define WRITE 1
int main()
{
   //fd       fd1
//ps | sed 1d | wc -l 
pid_t pid;
pid_t pid1;
pid_t pid2;
int fd[2];
int fd1[2];
pipe(fd);
pipe(fd1);
pid=fork();
if(pid==0)
{                          //redirecting into sed 1d
    close(fd[READ]);
    dup2(fd[WRITE],1);
    close(fd[WRITE]);
    execlp("ps","ps",NULL);
}
else
{
    pid1=fork();
    if(pid1==0)
    {                          //redirecting into wc -l
        close(fd[WRITE]);
        dup2(fd[READ],0);
        close(fd[READ]);
        close(fd1[READ]);
        dup2(fd1[WRITE],1);
        close(fd1[WRITE]);
        execlp("sed","sed","1d",NULL);
    }
    else
    {
        pid2=fork();
        if(pid2==0)
        {                          //must display on console
            close(fd1[WRITE]);
            dup2(fd1[READ],0);
            close(fd1[READ]);
            execlp("wc","wc","-l",NULL);
        }
        
        else
        
        {
            close(fd[READ]);
            close(fd[WRITE]);
            close(fd1[READ]);
            close(fd1[WRITE]);
            wait(NULL);
        }
        
    }
    
}

}

可能是什么问题?

解决方法

ps 进程的 fd1 管道两端都打开,而这不应该打开。此外,wc -l 进程的 fd 管道的两端都打开,但它不应该打开。修复这两件事,您的程序将停止挂起。此外,wait(NULL) 只等待一个子进程终止,而不是所有子进程终止,因此您冒着在程序实际完成之前重新出现终端提示的风险。