2013-05-14 2 views
1

다른 프로세스를 포크하는 프로그램을 작성하려고하는데 첫 번째 프로세스가 (i-1) 번째 프로세스가 완료 될 때까지 첫 번째 프로세스가 (i) th 반복. 2 개의 세마포어만으로 가능합니까?예기치 않은 출력 세마포어

child1: 0 
child2: 0 
child1: 1 
child2: 1 
child1: 2 
child2: 2 
child1: 3 
child2: 3 
child1: 4 
child2: 4 
child1: 5 
child2: 5 
child1: 6 
child2: 6 
child1: 7 
child2: 7 
child1: 8 
child2: 8 
child1: 9 
child2: 9 

하지만 난 한 아이 얻을 : 내가 기대

#include <stdio.h> 
#include <sys/types.h> 
#include <unistd.h> 
#include <stdlib.h> 
#include <errno.h> 
#include <semaphore.h> 

sem_t semA, semB,sem,m; 

int main(void) 
{ 
int i; 

    pid_t child_a, child_b,pid2,pid3; 
    sem_init(&semA, 0, 1); 
    sem_init(&semB, 0, 0); 
sem_init(&m, 0, 0); 

    child_a = fork(); 
//wait(); 

    if (child_a == 0) { 


    // int j; 

     pid2 =getpid(); 
     for (i = 0; i < 5;) 
     { 
    sem_wait(&semA); 
//sem_wait(&m); 
     printf("child1: %d\n", i); 
    i++; 
    //printf("pid1: %d\n", pid2); 
     //printf("--------------------------\n"); 
     sleep(3); 
//sem_post(&m); 

sem_post(&semB); 
     } 
}  
    else { 

    child_b = fork(); 
//wait(); 
    if (child_b == 0) { 

     pid3 =getpid(); 
     for (i = 0; i < 5;) 
     { 
sem_wait(&semB); 
//sem_wait(&m); 
     printf("child2: %d\n", i); 
i++; 
     //printf("pid2: %d\n", pid3); 
     //printf("--------------------------\n"); 
     sleep(5); 
//sem_post(&m); 
sem_post(&semA); 

     } 

    } 
    } 

    exit(0); 
    return 0; 
} 

출력은 다음과 같습니다

child1: 0 
+0

[예상치 못한 출력 실행 세마포] 가능한 복제본 (http://stackoverflow.com/questions/16549718/unexpected-output-running-semaphore) – Mat

+0

** 교차 게시하지 마십시오 **. 그런 다음 한 사이트에서 중복 질문이 생깁니다. 그것은 전혀 최적이 아니며 모든 사람의 시간을 낭비합니다. 하나의 사이트를 선택하십시오. 잘못된 사이트를 선택했다면 마이그레이션을 요청하십시오 (게시물에 플래그를 지정하고 "기타"텍스트 상자에서 원하는 것을 설명 함). – Mat

+0

'718은 (는) 이미 939의 복제본으로 폐쇄되어 있기 때문에이 (SO 16549939)는 SO 16549718과 중복 될 수 없습니다. –

답변

0

당신은 three semaphores을해야 할 수도 있습니다를 이것은 내가 지금까지 가지고있는 것입니다.

sem1 sem2 sem3

Process1 :

if(FirstRun){ 
    Initialize the semaphores 
    wait for sem2 
} 

post sem1 
wait for sem3 

Process2 :

if(FirstRun){ 
    Initialize the semaphores 
    post sem2 
} 

wait for sem1 
post sem3 

: 당신이이 Initialize the semaphores에서 세마포어를 shared memory에 매핑하여 두 프로세스가 모두 액세스 할 수있게합니다. 또한 일부 기본값으로 초기화하십시오 (0, 0, 0).