共享内存中的信号量,进程和递增变量

时间:2012-01-03 00:48:40

标签: c ipc semaphore shared-memory

这是一个家庭作业问题。我必须写一个程序自己20次。每个新进程都将+1加到一个变量(整数)上,该变量在所有变量之间共享。问题是,我必须使用信号量(IPC)。这段代码是“正常的” - 最终给出了20的值。

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

编辑: 基于this代码,我试图得到如下输出:
我是孩子1 ...
我是孩子2 ...



我是孩子20 ...

它工作一次(第一次),然后订单变得随机。但我没有改变任何代码。我做错了什么?

1 个答案:

答案 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;