1

簡単にするために縮小された次のソースを検討してください

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

それは完全に正常に動作し、問題はありません。ただし、に変更catmore、bash を中断します。

症状は次のとおりです。

  • 入力したものが表示されない
  • 「Enter」を押すと新しいプロンプトが表示されますが、新しい行ではなく同じ行に表示されます
  • 任意のコマンドを実行して出力を確認できます
  • reset物事を修正するのに役立ちます。

そのため、キーボードからの入力に問題があります。そこにはありますが、表示されません。

何故ですか?

アップデート:

  • からls | moreの出力は、私のプログラムの出力と同等です
  • moreプロセスは終了しません。それはによって孤立していますls
  • 唯一の目に見える問題は、親プロセスが終了した後のコンソールの状態にあります
  • 一部のシステムで、意図したとおりに機能します。たとえば、OpenSUSE では、Kubuntu では問題はありませんでした。どのような違いを探すべきかについての情報が見つかりませんでした。moreバイナリは両方のシステムで異なります
4

1 に答える 1

0

とは異なりcatmoreは以上を必要とする対話型プログラムであり、stdin-システムコールでは提供できない端末が必要です。パイプ内またはスクリプトから実行して、何が起こるかを確認してください。stdoutstderrmore

bashまた、ここではどの段階でも関与しないことに注意してください。execlp関数呼び出しは、現在のプロセスを引数として指定された別のプロセスに置き換えます。

于 2012-11-10T16:58:54.227 に答える