3

私はプロセス間通信を学んでいます...これは私を悩ませているコードです

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(void)
{
   int pfds[2];
   pipe(pfds);
    if (!fork()) 
    {
       printf("I m the child process\n");
       close(1);  /* close normal stdout */
       dup(pfds[1]);  /* make stdout same as pfds[1] */


       close(pfds[0]); /* we don't need this */
       execlp("ls", "ls", NULL);
 } 
 else 
 {
    printf("I m the parent process\n");
    close(0);       /* close normal stdin */
    dup(pfds[0]);   /* make stdin same as pfds[0] */
    close(pfds[1]); /* we don't need this */
    execlp("wc", "wc", "-l", NULL);
 }
  return 0; 

}

これらはいくつかの質問です:- 1) execlp() の後、何も実行されないことに同意しますが、私の printf() ステートメントは execlp() の前にありますが、それでもなぜ実行されないのですか??

2)プログラムはLinuxでパイプコマンドとして機能するため、「ls | wc -l」のように実行されますが、システムは「wc -l | ls」ではなく「ls | wc -l」のようにプログラムを実行することをどのように認識しますか.. ??

3) 2) の質問は、stdout を閉じて pfds[1] として使用し、stdin を閉じて pad[0] として使用したためだと思います。 . ??

4)(gccと同様にXcodeを使用しています)、上記のプログラムをgccで実行するとうまくいきますが、Xcodeで実行すると「SIGTRAP」が表示され、コンソールに「1」が返されます

PLZヘルプ...

PS:一般的な問題で別のスレッドの実行を確認する方法を誰かが教えてくれたらもっといいでしょう!! ありがとうございました !!

4

1 に答える 1

4
  1. あなたprintfは処刑されています。ただし、stdout をリダイレクトした後にのみフラッシュされるため、その出力は端末に表示されません。fprintf(stderr, ...)stderr で表示したい場合、またはfflush(stdout)ファイル記述子をいじり始める前に試してください。

  2. パイプの書き込み側をlsプロセスの stdout に接続し、読み取り側を stdin onwcに接続するので、混乱はありません。

  3. ここであなたの懸念が何であるかわかりません。lsディレクトリの一覧表示が完了するとプロセスは終了し、入力がなくなると終了wcし、行数が出力されます。エンドポイントを保持する両方のプロセスが終了すると、パイプは自動的にクリーンアップされます。

  4. 言いにくい。デバッガーは何を表示しますか? ただし、Xcode デバッグ環境は、主にデスクトップ/モバイル アプリケーションの開発とデバッグを目的としているため、おそらく何らかの偶然に過ぎません。

于 2013-01-10T07:17:37.520 に答える