我正在学习操作系统课程,当你有分叉时,我很难用 dup2 重定向输入。我编写了这个小程序来尝试理解它,但我没有成功地将孙子的输出传递给孩子。我正在尝试模仿 unix 命令: ps -A | 厕所-l。我是 Unix 新手,但我相信这应该计算我得到的正在运行的进程列表的行数。所以我的输出应该是一个数字。
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <iostream>
using namespace std;
int main( int argc, char *argv[] ) {
char *searchArg = argv[ 1 ];
pid_t pid;
if ( ( pid = fork() ) > 0 ) {
wait( NULL );
cout << "Inside parent" << endl;
}
else if ( pid == 0 ) {
int fd1[ 2 ];
pipe( fd1 );
cout << "Inside child" << endl;
if ( pid = fork() > 0 ) {
dup2( fd1[ 0 ], 0 );
close( fd1[ 0 ] );
execlp( "/bin/wc", "-l", NULL );
}
else if ( pid == 0 ) {
cout << "Inside grand child" << endl;
execlp( "/bin/ps", "-A", NULL );
}
}
return 0;
}
我在上面的代码中没有它,但这是我对事情应该如何进行的猜测:
- 我们需要重定向命令 ps -A 的标准输出(通常会打印到屏幕上,对吗?),以便 wc -l 命令可以使用它来计算行数。
- 可以使用 dup2 重定向此标准输出,例如 dup2(?, 1),这意味着将标准输出重定向到 ?。然后你关闭?
问题:我将它重定向到哪里?我知道它应该是文件描述符之一,但是应该将它重定向到哪里以便 wc 可以处理它?
- wc 以某种方式接收标准输出。
问题: wc 如何接收输出?通过 execlp 参数?或者操作系统是否检查文件描述符之一?
- 执行 wc -l。
其中哪一个是关闭并保持打开以便 wc 接收和处理 ps 的输出?我一直认为这需要倒过来考虑,因为 ps 需要将其输出提供给 wc ......但这似乎没有意义,因为孩子和孙子都是并行处理的。