2012-01-03 100 views
1

這是一個作業問題。我必須編寫一個程序分叉20次。每個新進程都將一個變量(整數)+1加到它們之間共享的變量中。事情是,我必須使用信號量(IPC)。這段代碼是'工作' - 最後給出20的值。共享內存中的信號量,進程和遞增變量

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

編輯: 基於this代碼,我試圖讓輸出,如:
我的孩子1 ...
我的孩子2 ...



我是小孩20 ...

它曾經工作過一次(第一次),然後訂單變得隨機。但我沒有更改任何代碼。我究竟做錯了什麼?

+2

您可能已將您的fork()調用錯誤。它向父進程返回非零值;因此,只有你的父母增加了價值。 – zneak 2012-01-03 02:17:43

回答

2

嗯,你的主要問題是:

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

fork()將返回-1上的錯誤,父PID或零的孩子。所以你實際上正在做父母的一切。更改爲(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

即使分支失敗,增量也會由父級完成。 – 2012-01-03 02:49:31

+0

@Jonathan Leffler是的,措辭不好。我會改變它。 – Duck 2012-01-03 02:52:20