2012-01-03 23 views
1

これは宿題に関する質問です。私は自分自身を20回フォークするプログラムを書く必要があります。それぞれの新しいプロセスは、すべてのプロセスが共有する変数(整数)に+1を加えています。事は、私はセマフォ(IPC)を使用しなければならないということです。このコードは「作業中」です。最後に20の値を与えます。共有メモリ内のセマフォ、プロセス、インクリメント変数

*buf = 0; 
for(i=1; i<=20; ++i) 
{ 
    if(fork()!=0) 
    { 
     *buf += 1; 
     exit(0); 
    } 
} 

EDIT: 私はのような出力を取得しようとしていますthisコードに基づいて:
私は子供1 ...私は子供の午前2時
...



私は子供です20 ...

これは1回(初回)働いてから順番が乱れました。しかし、私はコードを変更しませんでした。私は間違って何をしていますか?

+2

あなたの 'fork()'呼び出しが間違っている可能性があります。親プロセスに非ゼロを返します。したがって、親だけが値をインクリメントします。 – zneak

答えて

2

さて、あなたの主な問題は、このです:

if (fork()!=0) //<-- this 

fork()は、子の親のpid、エラー時に-1を返す、またはゼロになります。あなたは実際に親のすべてをやっています。 (fork()== 0)に変更すると、あなたが望むことができます。

また、お子様を待って共有メモリを切り離す必要があります。 (プロセスIDの出力を少し追加して少し明確にしました)

printf("I AM THE PARENT pid = %d\n", getpid()); 

*buf = 0; 
for(i=1; i<=20; ++i) 
{ 
    if((pid = fork()) == -1) 
    { 
     perror("fork"); 
     exit(1); 
    } 

    if (pid == 0) 
    { 
     v(semid, 0); 
     *buf += 1; 
     p(semid, 0); 
     printf("I am child %d with pid = %d\n", i, getpid()); 
     shmdt(buf); 
     exit(0); 
    } 
} 


for (i = 1; i <= 20; ++i) 
{ 
    pid = wait(&status); 
    printf("child pid = %d reaped\n", pid); 
} 

printf("buf: %p\n", buf); 
printf("*buf: %d\n", *buf); 

shmdt(buf); 

return 0; 
+0

フォークが失敗しても、増分は親によって行われます。 –

+0

@ジョナサン・レフラーええ、悪い言葉遣い。私はそれを変更します。 – Duck

関連する問題