这是一个家庭作业问题。我必须写一个程序自己20次。每个新进程都将+1加到一个变量(整数)上,该变量在所有变量之间共享。问题是,我必须使用信号量(IPC)。这段代码是“正常的” - 最终给出了20的值。
*buf = 0;
for(i=1; i<=20; ++i)
{
if(fork()!=0)
{
*buf += 1;
exit(0);
}
}
编辑:
基于this代码,我试图得到如下输出:
我是孩子1 ...
我是孩子2 ...
。
。
。
我是孩子20 ...
它工作一次(第一次),然后订单变得随机。但我没有改变任何代码。我做错了什么?
答案 0 :(得分:2)
你的主要问题是:
if (fork()!=0) //<-- this
fork()
将在出错时返回-1,父pid为孩子的OR ZERO。所以你实际上在做父母的一切。改为(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;