Sem_post() 无法正常工作,这既不是增加信号量的值,也不是解除阻塞附加到该信号量的进程[重复]

Posted

技术标签:

【中文标题】Sem_post() 无法正常工作,这既不是增加信号量的值,也不是解除阻塞附加到该信号量的进程[重复]【英文标题】:Sem_post() not working correctly that is neither its increasing the value of semaphore nor unblocking the process attached to that semaphore [duplicate] 【发布时间】:2019-02-05 10:25:27 【问题描述】:

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

【问题讨论】:

请评论您的代码 【参考方案1】:

引用man sem_init

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

如果pshared非零,则信号量在进程之间共享, 并且应该位于共享内存区域中(参见 shm_open(3), mmap(2) 和 shmget(2))。 (因为由 fork(2) 创建的孩子继承 其父的内存映射,它也可以访问信号量。)任何 可以访问共享内存区域的进程可以在 使用 sem_post(3)、sem_wait(3) 等的信号量。

您的信号量不在共享内存中,因此分叉的子进程将看不到父进程中所做的任何更改(反之亦然)。因此,两个进程都会陷入死锁。

【讨论】:

以上是关于Sem_post() 无法正常工作,这既不是增加信号量的值,也不是解除阻塞附加到该信号量的进程[重复]的主要内容,如果未能解决你的问题,请参考以下文章

微信开发模式无法验证以及返回消息中文乱码的情况

苹果手机微信视频为啥不能播放?

按下本地反应按钮无法正常工作

为啥小程序无法正常使用了呢。

TwigBridge扩展基础模板无法正常工作

2017年11月8日最新仿互站导航t5友价商城-9套模板首页都增加微信登陆