2013-04-16 91 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