使用 dup2 命令重定向
redirection using dup2 command
我知道这是一个简单的练习,但我遇到了麻烦。
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)
仅等待一个子进程终止,而不是所有子进程终止,因此您冒着在程序实际完成之前重新出现终端提示的风险。
我知道这是一个简单的练习,但我遇到了麻烦。
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)
仅等待一个子进程终止,而不是所有子进程终止,因此您冒着在程序实际完成之前重新出现终端提示的风险。