2012-12-18 52 views
0

如何在使用匿名posix信号量的进程中实现 生产者/ consmer问题? (这意味着我需要有2个进程,其打印反过来一些文本,第二个可以从1日开始分叉)使用posix无名信号量的IPC

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点时, 但我发现“未命名信号或者私有,通过fork()继承“在oracle文档中http://docs.oracle.com/cd/E19253-01/816-5137/sync-39/index.html 有什么问题?


我的解决办法是在这里https://www.dropbox.com/s/zzgsyj9rq1ngv0s/ost_13p.c

+0

你能更具体一点吗?不清楚你在问什么。 – Rhs

+0

2过程:第二个从第一个分叉开始,他们都应该交替打印一些东西。任务是使用未命名的posix信号量。据我所知,共享内存是这种情况下的解决方案,但我不知道如何。 –

回答

1

分配共享内存中的信号量(由shm_open),然后再试一次。

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

+0

>(和shm_open一样) 我必须使用未命名的信号量 –

+0

*信号量*将是未命名的。如果共享内存必须未命名,请尝试MAP_ANONYMOUS/MAP_ANON或映射'/ dev/zero'。如果这不起作用,可以在一些类似mktemp的名称上使用'shm_open(O_EXCL)',然后使用'shm_unlink()'。不完美,但可能完全可以维修。 – pilcrow

+0

是的,你是绝对正确的(我通过缺乏attantion读取sem_open) –