2

パイプを使用して、親プロシージャと子プロシ​​ージャの間で通信を行います。私が読んだ本は、親procにいるとき、pipefd [1]を閉じなければならないと言っていますが、それをしなかったので、他に何も起こりません。制御されていない?」よろしくお願いします!

int pipefd[2];
if(pipe(pipefd) == -1)
{
    perror("pipe communication error");
    exit(EXIT_FAILURE);
}
int fd = fork();
if(fd < 0)
{
    perror("fork child process error");
    exit(EXIT_FAILURE);
}
if(fd != 0)//run in parent proc
{
    int a = -1;
    int i = 1;
    //close(pipefd[1]);                         ## here! ##
    while(i)
    {
        read(pipefd[0], &a, sizeof(a));
        printf("%d\n", a);
        sleep(4);
    }
}
else//run in child proc
{
    int i = 1;
    //close(pipefd[0]);                         ## here! ##
    while(i)
    {
        write(pipefd[1], &i, sizeof(i));
        i++;
        sleep(1);
    }
}
4

2 に答える 2

1

リーダーがパイプの書き込み側を閉じない場合、ライター プロセスがパイプを閉じたときにエンドオブファイルを受信しません (書き込み側で開かれているファイル記述子がまだあるため)。

于 2012-04-12T09:44:36.757 に答える
0

パイプを閉じることをお勧めします。これは、自分自身から身を守るためです。つまり、リーダー プロセスが誤ってパイプに書き込みを行ったり、ライター プロセスが誤ってデータを読み取ったりしないようにするためです。したがって、一般的には防御的なプログラミング手法の一種です。

閉じるパイプにアクセスしない限り、悪いことは何も起こりません。

まあ、ここで私は 100% 正しいわけではありません: 私の声明はあなたのような単純なプログラムに当てはまりますが、多くのパイプを開いて閉じるのを忘れると、プログラムは遅かれ早かれ (通常は 255 かそこらの後) それらをリークします。パイプを開きますが、YMMV) 新しいパイプを開くことはできません。すべてのパイプ スロットが漏れたパイプによって使い果たされるためです。

ただし、これはあなたのプログラムには当てはまりません。

それにもかかわらず、パイプを閉じることをお勧めします。これにより、間違ったパイプの端に誤ってアクセスした場合にエラーが発生します。

于 2012-04-12T09:04:15.850 に答える