2013-04-16 68 views
1

我試圖同步兩個進程(孩子&父)與信號量,但我的嘗試失敗。與C語言進程同步

的C源代碼如下:

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <semaphore.h> 
#include <fcntl.h> 
#include <sys/stat.h> 


int compteur=0; 
sem_t *sem; 

int main() 
{ 
     void *ret; 
     sem = sem_open("/sem", O_CREAT, 0644, compteur); 
     sem_init(sem, 0, 0); 
     pid_t pid; 
     pid=fork(); 
     switch (pid) 
     { 
      case -1: 
       printf("Erreur: echec du fork()\n"); 
       exit(1); 
       break; 
      case 0: 
       /* PROCESSUS FILS */ 
       printf("Processus fils : pid = %d\n", getpid()); 
       sem_post(sem); 
       break; 
      default: 
       sem_wait(sem); 
       /* PROCESSUS PERE */ 
       printf("Ici le pere%d: le fils a un pid=%d\n",getpid(),pid); 
       printf("Fin du pere.\n"); 
    } 
} 

我覺得現在的問題是,該信號是不是在子進程可見。我怎麼解決這個問題?

+0

可能的複製,而是看[這裏](http://stackoverflow.com/questions/6847973/do-forked-child-processes首先使用相同的信號量)。 –

+0

可能你已經解決了,但是這裏的解決方案是使用sharedmemory來共享信號量:當你創建一個子進程時,父親的變量是DUPLICATED,而不是共享的(比如在線程中),所以你在調用sem_post和sem_wait不同的SEMAPHORES!否則,如果使用sharedmemory段來保存信號量並將其用於不同的進程。我鏈接你一個運行良好的程序:[鏈接](https://dl.dropboxusercontent.com/u/6701675/informatica/processi_esame.c) –

回答

-1

0是主進程,-1是錯誤,大於0的任何值都是子進程。您必須有機會切換到> 0以獲得孩子。

+0

但是,當我執行它沒有信號的部分「默認」(> 0)除了pid的延遲確認此部分(= 0)之前開始。 –

0

sem_init應該是:

sem_init(sem, 1, 0); 

也就是說,第二個參數應該是非零。
由於對:

#include <semaphore.h> 
int sem_init(sem_t *sem, int pshared, unsigned int value); 

(從man sem_init

If pshared has the value 0, then the semaphore is shared between the threads of a process... 
If pshared is nonzero, then the semaphore is shared between processes... 
+0

謝謝你的幫助 –