2012-01-03 75 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