2012-12-18 91 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) –