繁体   English   中英

使用 dup2 命令重定向

[英]redirection using dup2 command

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

 ps | sed 1d | wc -l

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

#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 pipe 的两端,这是不应该的。 此外, wc -l进程打开了fd pipe 的两端,这是不应该的。 修复这两个问题,您的程序将停止挂起。 此外, wait(NULL)仅等待一个子进程终止,而不是所有子进程,因此您冒着在程序实际完成之前重新出现终端提示的风险。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM