我试图在分叉后让多个进程看到一个信号量。这是餐饮哲学家使用共享记忆和信号量来确保只有一个哲学家一次拿起筷子的问题(不是最有效的方式,一组信号量会更有效,但这不是重点)。它在start内部进入while循环,打印输出,但没有进程通过任何进程进入if语句。
全球范围:
int semId;
Inside my main:
semId=semget(IPC_PRIVATE,1,S_IRUSR|S_IWUSR);
for(int i =0; i<5; i++)
if(fork()==0)
start(i);
void start(int philNo){
struct sembuf semWait[1]={{0,-1,0}};
struct sembuf semSignal[1] = {{0,1,0}};
while(philArr[philNo].stomach<100){
printf("entered while\n");
//see if the semaphore is available
if (semop(semId,semWait,1)==0)
{
printf("semaphore available/n");
}
此处提供完整的代码:http://pastie.org/10054082在全球宣布的某些事情不应该是,但是一旦我开始工作就会被清理
答案 0 :(得分:0)
信号量以0计数开始。所以有人必须semSignal
才能让球滚动。我在semSignal
孩子的循环之后在main
放了一个forks
,这让孩子们能够获得信号量。