2013-04-16 92 views
0

我假定我的程序应该工作是这样的: 1)初始化与值未命名信号= 0 为sem_init(..)的第二个值是1,从而它在MAN信号量进程之间共享所述 2)创建的孩子,孩子一直等待,直到信号值变为1POSIX信号麻烦

父进程增加信号量的值,所以孩子现在应该退出 但它并没有真正退出,那么这就是问题所在

#include <stdlib.h> 
#include <stdio.h> 
#include <unistd.h> 
#include <semaphore.h> 


pid_t child; 


void child_proc(sem_t* sem) { 
    sem_wait(sem); 
    printf("OK\n"); 
} 

void parent_proc(sem_t* sem) { 

    sem_post(sem); 
    sleep(2); 

    int status; 
    waitpid(child, &status, 0); 
} 

int main(int argc, char* argv[]) { 
    sem_t sem; 
    sem_init(&sem, 1, 0); 

    child = fork(); 

    if (0 == child) { 
     child_proc(&sem); 
     return 0; 
    } 

    parent_proc(&sem); 
    return 0; 
} 

回答

1

问题在于两个进程都有一个信号量结构的本地(不共享)副本,一个进程中的更改不会反映到另一个进程中。

由于the man page also says,如果要跨进程共享信号灯,你不仅需要一个非零值传递给sem_init第二个参数,但sem_t结构也需要在共享内存区存在。在您的示例程序中,它存在于不共享的堆栈中。

您可以通过使用通用文件映射(与mmap)或与shm_open共享内存,值得注意的是。

+0

我应该使用自己创建共享内存块并将sem_t放入它吗? – NinjaTurtle

+0

@NinjaTurtle,是的,这几乎是你必须做的。 – zneak

+0

好吧,做完之后我还有另外一个问题:男人说(http://man7.org/linux/man-pages/man2/msync.2.html)共享数据必须在每次更改后更新,所以我需要在每个信号量动作之后调用'msync()',是吗?:( – NinjaTurtle