私はオペレーティング システムのコースを受講していますが、フォークがある場合に 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( ?, 1 ) のように、dup2 を使用してリダイレクトできます。次に、閉じますか?
質問: どこにリダイレクトしますか? ファイル記述子の1つである必要があることはわかっていますが、wcが処理できるようにどこにリダイレクトする必要がありますか?
- wc は何らかの方法で標準出力を受け取ります。
質問: wc はどのように出力を受け取りますか? execlp パラメーターを介して? または、オペレーティング システムはファイル記述子の 1 つをチェックしますか?
- wc -l を実行します。
wc が ps の出力を受け取って処理するために閉じられ、開いたままになっているのはどれですか? ps はその出力を wc に渡す必要があるため、これは逆に考える必要があると考え続けています...しかし、子と孫の両方が並行して処理されているため、それは意味がないようです。