Linux中的信号量+叉子

Posted

技术标签:

【中文标题】Linux中的信号量+叉子【英文标题】:semaphore + fork in linux 【发布时间】:2011-12-17 15:28:51 【问题描述】:

我在 Linux 中遇到了信号量和 fork 的问题,这是我的代码:

#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <stdlib.h>
#include <unistd.h>

#define KEY 464

void debug(int semafor_id) 
    printf("Value of sem 0 is: %d \n",  semctl (semafor_id, 0 , GETVAL , 0));


void main()

   int id;  
   struct sembuf operations[1]; 


   // Sreate semaphore
   id = semget(KEY, 1, 0777 | IPC_CREAT );


   // set value
    operations[0].sem_num = 0;
    operations[0].sem_op = 10;  
    operations[0].sem_flg = 0;

    semop(id, operations, 1);  

   // show what is the value 

    debug(id);


   // do the same with the child process 
    if(!fork()) 
        printf("IN child process \n");
        debug(id);
        exit(0);
    

    semctl (id, 0 ,  IPC_RMID , 0);


输出是:

sem 0 的值为:10 IN 子进程: sem 0 的值为:-1

所以看来我不能在子进程中使用信号量。我认为我不需要使用共享内存。帮忙?

【问题讨论】:

【参考方案1】:

你有一个竞争条件。

如果父级在fork 之后继续执行,在子级有机会运行之前,则父级将在子级检查其值之前销毁信号量。

在销毁信号量之前在父级中添加某种暂停,或者更好地使用wait 和/或使用strerror 找出子级中的确切错误。

【讨论】:

以上是关于Linux中的信号量+叉子的主要内容,如果未能解决你的问题,请参考以下文章

叉子的流程,我有多少个叉子?

futex 工具返回了意外的错误代码并已中止

哲学家就餐问题

使用二进制信号量用餐哲学家

具有 3 个元素的信号量

linux中的信号怎么理解?