[英]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.