2013-05-14 3 views
0

첫 번째 프로세스는 두 번째 프로세스가 (i-1) 번째 반복을 완료하지 않는 한 첫 번째 프로세스를 시작하지 않아야합니다. 출력은 내가 필요로하는 것이 아닙니다. 가능한지 궁금합니다. 단 두 개의 세마포어에 의해 출력이 있습니까? 내 코드는 다음과 같습니다.예기치 않은 출력 세마포어

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 

사용하기 위해서는

+2

코드 프레젠테이션은 치명적인 것입니다. 그런 다음 항상 사용중인 시스템 호출의 매뉴얼 페이지를 읽고 다양한 오류 조건을 이해 한 다음 반환 값을 확인하고 이러한 오류 조건을 캡처하십시오. 항상. –

답변

2

(우분투 12.10를 실행하는거야) 여러 프로세스에서 세마포어를 사용하려면 명명 된 세마포어를 사용하거나 공유 메모리에 세마포어를 배치해야합니다.

리눅스 설명서 페이지 sem_overview(7)을 참조하십시오.

당신이하고있는 일을 위해, 명명 된 세마포어는 공유 메모리보다 사용하기가 더 쉽습니다. 다음 작업을해야합니다 :

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

sem_t * semA; 
sem_t * semB; 
int main(void) 
{ 
    int i; 

    pid_t child_a, child_b,pid2,pid3; 
    semA = sem_open("/mysema", O_CREAT, S_IRUSR | S_IWUSR, 1); 
    semB = sem_open("/mysemb", O_CREAT, S_IRUSR | S_IWUSR, 0); 

    child_a = fork(); 

    if (child_a == 0) { 

     pid2 =getpid(); 
     for (i = 0; i < 5;) 
     { 
     sem_wait(semA); 
     printf("child1: %d\n", i); 
     i++; 
     sem_post(semB); 
     sleep(3); 
     } 
    } 
    else { 
    child_b = fork(); 
    if (child_b == 0) { 

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

     } 

    } 
    } 

    exit(0); 
    return 0; 
} 
+0

공유 메모리에 세마포어를 배치하는 방법은 무엇입니까? – Hanna

+2

cebarth가 말한대로 sem_overview (7)와 그것이 가리키는 다른 매뉴얼 페이지를 읽으십시오. –

+0

semaphores를 사용한 것은 이번이 처음입니다. sem_overview (7)를 읽었지만 샘플을 찾을 수 없었습니다. [http://man7.org/linux/man-pages/man7/sem_overview.7. html) 그래서 내가 다시 물었습니다. – Hanna