IPC使用posix未命名的信号量

时间:2012-12-18 18:44:21

标签: posix ipc semaphore

如何实现 使用匿名posix信号量的进程中的生产者/消费者问题? (这意味着我需要有2个进程依次打印一些文本,第2个可以从第1个分叉)

pthread_t pchild; 
int i = 0; 
pid_t pid; 

sem_init(&fst, 1, 1); 
sem_init(&scnd, 1, 0); 

if((pid = fork()) == 0){  

    while(i<10){ 
    sem_wait(&scnd); 
    printf("CHILD\n"); 
    sem_post(&fst); 
i++; 
} 
}else if(pid != -1){     

while(i<10){ 
        sem_wait(&fst); 
        printf("parent\n"); 
        sem_post(&scnd); 
        i++; 
        } 
}else{ printf("error - fork !!!\n");} 

sem_destroy(&fst); 
sem_destroy(&scnd); 

此代码仅打印 “父母” - 1次, 但我在oracle docs http://docs.oracle.com/cd/E19253-01/816-5137/sync-39/index.html发现“未命名的信号量是私有的,通过fork()继承” 怎么了?


我的解决方案在https://www.dropbox.com/s/zzgsyj9rq1ngv0s/ost_13p.c

1 个答案:

答案 0 :(得分:1)

在共享内存中分配信号量(如shm_open所示),然后重试。

仅在pshared中设置sem_init参数是不够的。 sem_t *参数引用的内存也必须在进程之间共享。