【问题标题】:Semaphores, processes and incrementing variables in shared memory共享内存中的信号量、进程和递增变量
【发布时间】:2012-02-01 04:07:00
【问题描述】:

这是一道作业题。我必须编写一个程序自行分叉 20 次。每个新进程都将 +1 添加到所有进程之间共享的变量(整数)。问题是,我必须使用信号量(IPC)。这段代码正在“工作” - 最后给出 20 的值。

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

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

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

【问题讨论】:

  • 您的fork() 呼叫可能有误。它向父进程返回非零值;因此,只有您的父母会增加该值。

标签: c ipc semaphore shared-memory


【解决方案1】:

你的主要问题是:

    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;

【讨论】:

  • @Jonathan Leffler 是的,措辞不好。我会改的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-27
  • 1970-01-01
  • 1970-01-01
  • 2010-10-26
  • 2020-09-09
相关资源
最近更新 更多