共享内存中的信号量,进程和递增变量
这是一个作业问题。我必须编写一个程序分叉20次。每个新进程都将一个变量(整数)+1加到它们之间共享的变量中。事情是,我必须使用信号量(IPC)。这段代码是'工作' - 最后给出20的值。共享内存中的信号量,进程和递增变量
*buf = 0;
for(i=1; i<=20; ++i)
{
if(fork()!=0)
{
*buf += 1;
exit(0);
}
}
编辑: 基于this代码,我试图让输出,如:
我的孩子1 ...
我的孩子2 ...
。
。
。
我是小孩20 ...
它曾经工作过一次(第一次),然后订单变得随机。但我没有更改任何代码。我究竟做错了什么?
嗯,你的主要问题是:
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;
即使分支失败,增量也会由父级完成。 – 2012-01-03 02:49:31
@Jonathan Leffler是的,措辞不好。我会改变它。 – Duck 2012-01-03 02:52:20
您可能已将您的fork()调用错误。它向父进程返回非零值;因此,只有你的父母增加了价值。 – zneak 2012-01-03 02:17:43