2013-04-16 1 views
1

견인 프로세스 (자식 & 부모)를 세마포와 동기화하려고했지만 시도가 실패했습니다.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"); 
    } 
} 

내가 문제가 세마포어가 자식 프로세스에 표시되지 있다는 것을 생각 :

C 소스 코드는 다음과 같다. 이 문제를 어떻게 해결할 수 있습니까?

+0

가능한 복제 (man sem_init에서) http://stackoverflow.com/questions/6847973/do-forked-child-processes -use-the-same-semaphore)를 먼저 사용하십시오. –

+0

아마 해결 했겠지만 해결 방법은 공유 메모리를 사용하여 세마포어를 공유하는 것입니다. 자식 프로세스를 만들 때 아빠의 변수는 공유되지 않고 (스레드와 같이) 공유되지 않으므로 sem_post 및 sem_wait를 호출합니다 다른 학자들! 그렇지 않으면 세마포어를 저장하고 다른 프로세스에서 공유 메모리 세그먼트를 사용하는 경우 나는 좋은 프로그램을 링크시킨다. [link] (https://dl.dropboxusercontent.com/u/6701675/informatica/processi_esame.c) –

답변

-1

0은 주 프로세스이고 -1은 오류이며 0보다 큰 값은 자식입니다. 자식을 얻으려면> 0으로 전환해야합니다.

+0

하지만 세마포어없이 "default"(> 0) 부분을 실행하면, (= 0) 부분 앞에서 시작하여 pid를 표시하면이를 확인할 수 있습니다. –

0

귀하의 sem_init해야한다 :

입니다
sem_init(sem, 1, 0); 

, 두 번째 인수가 아닌 0이어야합니다.
에 대한 때문에 :

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

(하지만 [여기]를 참조

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

도움 주셔서 감사합니다. –