簡単にするために縮小された次のソースを検討してください
int main()
{
int d[2];
pipe(d);
if(fork())
{
close(1);
dup(d[1]);
execlp("ls", "ls", NULL);
}
else
{
close(0);
dup(d[0]);
execlp("cat", "cat", NULL);
}
}
ls
したがって、パイプを作成し、出力を からにリダイレクトしますcat
。
それは完全に正常に動作し、問題はありません。ただし、に変更cat
しmore
、bash を中断します。
症状は次のとおりです。
- 入力したものが表示されない
- 「Enter」を押すと新しいプロンプトが表示されますが、新しい行ではなく同じ行に表示されます
- 任意のコマンドを実行して出力を確認できます
reset
物事を修正するのに役立ちます。
そのため、キーボードからの入力に問題があります。そこにはありますが、表示されません。
何故ですか?
アップデート:
- から
ls | more
の出力は、私のプログラムの出力と同等です more
プロセスは終了しません。それはによって孤立していますls
- 唯一の目に見える問題は、親プロセスが終了した後のコンソールの状態にあります
- 一部のシステムでは、意図したとおりに機能します。たとえば、OpenSUSE では、Kubuntu では問題はありませんでした。どのような違いを探すべきかについての情報が見つかりませんでした。
more
バイナリは両方のシステムで異なります