0

私はこのコードを書きました:

#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>

#define N 10

int fd[2];

void son ()
{
int data=0;
if(read(fd[0], &data, sizeof(int))==sizeof(int))
    fprintf(stderr,"%d\n",data);
else
    fprintf(stderr,"Read failed\n");
}

int main(int argc, char** argv)
{
pid_t sons[N];
pipe(fd);
int data=5;
for(unsigned int i=0; i<N;i++)
{
    sons[i]=fork();
    if(!sons[i])
    {
        son();
        break;
    }
}
write(fd[1], &data, sizeof(int));
data=6;
}

実行してみると、「5」が10回印刷されます。
どうしたの?すべてのプロセスが同じデータを読み取ったのはなぜですか?データを一度だけ読み取ることはできませんか?リーダープロセスが読み取ったデータを消費していると思いました。
私はこのようにコードを変更しました:

#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>

#define N 10

int fd[2];

void son ()
{
int data=0;
if(read(fd[0], &data, sizeof(int))==sizeof(int))
    fprintf(stderr,"%d\n",data);
else
    fprintf(stderr,"Read failed\n");
if(read(fd[0], &data, sizeof(int))==sizeof(int))
    fprintf(stderr,"%d\n",data);
else
    fprintf(stderr,"Read failed\n");
}

int main(int argc, char** argv)
{
pid_t sons[N];
pipe(fd);
int data=5;
for(unsigned int i=0; i<N;i++)
{
    sons[i]=fork();
    if(!sons[i])
    {
        son();
        break;
    }
}
write(fd[1], &data, sizeof(int));
data=6;
write(fd[1], &data, sizeof(int));
return 0;
}

だから私は2回書き込み/読み取りをします、私が得る出力は「5」と「6」です、一度だけ、10のプロセスすべてがパイプを読み取ることができるということは起こりません。なぜこれですか?

4

1 に答える 1

3

fork()を実行すると、son()が実行され、ループから抜け出します。ただし、これで子プロセスは終了しません。その後、子は続行してfd[1]に書き込みます。

于 2012-05-31T15:37:47.503 に答える