Sem_post()工作不正常,其既不增加其信号量的值,也不解除阻塞连接到该信号灯[重复该过程

问题描述 投票:0回答:1

这个问题已经在这里有一个答案:

sem_post()工作不正常,既不增加其信号量的值,也不解除阻塞连接到该信号块队列过程

#include <stdio.h>
#include <semaphore.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

int main()
{
    sem_t pa,ch;
    sem_init(&pa,1,1);  
    sem_init(&ch,1,0);

    pid_t p1;

    p1 = fork();
    if(p1>0)    //Parent process
    {
        while(1)
        {
        sem_wait(&pa);
        printf("Parent\n");
        sem_post(&ch);
        }
    }
    else if(p1==0)
    {
        while(1)
        {
            sem_wait(&ch);
        printf("child\n");
        sem_post(&pa);
        }
    }
    else
        printf("\nError\n");

    return 0;
}

预期输出是

Parent
child
Parent
child
Parent
child
.. and so on..

实际产量

Parent
c process ipc semaphore
1个回答
1
投票

引述man sem_init

int sem_init(sem_t *sem, int pshared, unsigned int value);

如果pshared为非零,则信号量进程之间共享的,并且应该位于共享存储器的区域(见的shm_open(3),MMAP(2),和shmget的(2))。 (由于由叉创建子(2)继承父的存储器映射,它也可以访问信号量。),其可以访问共享存储器区域可使用sem_post信号量进行操作的任何方法(3),sem_wait(3),和等等。

你的信号是不是在共享内存,因此派生的子进程将不会在父进程(反之亦然)做任何更改。因此,这两个过程碰上了死锁。

© www.soinside.com 2019 - 2024. All rights reserved.