リストを頭からつま先まで調べることができるように、(または)を介してターミナルでページングできる長いリストを出力する小さなプログラムを作成したいと思います...more
less
プログラム:
fork
more
プログラムが実行される子プロセスから離れている- 親プロセスでは、リストが出力されます
- 親によって
pipe
印刷されたリストがプログラムのstdout
more
stdin
コード:
int main(int argc, char *argv[])
{
int pager, status;
int pipes[2];
pipe(pipes);
pager = fork();
if (pager == 0) { // child
dup2(pipes[0], 0);
close(pipes[1]);
char *args[] = {"more", NULL};
execvp(args[0], args);
} else { // parent
dup2(pipes[1], 1);
int x;
for (x = 0; x < 500; x++) {
printf("Hello World! %d\n", x);
}
close(pipes[0]);
close(pipes[1]);
wait(&status);
}
return 0;
}
私はこれをほとんどの部分で機能させています:
- 「Hello World!...」メッセージの長いリストが a でクリップされた端末に出力される
--More--
ので、基本的なパイプのセットアップが機能していることがわかります。 [q]
リスト全体の印刷が終了する前に押すと(more
プロセスを終了する)、プログラム(親/子)が期待どおりに終了します
私が抱えている唯一の問題は、[space]
or[return]
を押し続けmore
てリストの最後 (500 番目の "Hello World!..." メッセージ) に到達すると、端末がハングすることです。押し[q]
ても反応がありません (出なければ [ctrl+c]
なりません)。
親プロセスが でスタックしていwait
ます。 親のmore
両方のパイプを閉じたにもかかわらず、プロセスが終了しません