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中的信号量+叉子的主要内容,如果未能解决你的问题,请参考以下文章