2014-02-19 2 views
0

우리는 자식 프로세스의 NUM_PLAYERS 있고, 그 출력의 총 엉망를 얻을 수 있도록 그들 모두가 동시에 작성, 그들 각각은다른 프로세스가 동시에

player 5: I scored 0 (PID = 411160) 

처럼 해당 ID를 출력하지만 문제입니다.

player player player 1: I'm in this game (PID = 11049) 
player 01: I scored 3: I'm in this game (PID = 11051: I'm in this game (PID = 1048) 

어떻게하면 서로 기다릴 수 있습니까? 실제 코드는 여기

int main(int argc, char *argv[]) 
{ 

    for (i = 0; i < NUM_PLAYERS; i++) { 
     /* TODO: spawn the processes that simulate the players */ 
     switch(pid = fork()) { 

     case -1: 
      printf("Perror\n"); 
      exit(EXIT_FAILURE); 
      break; 
     case 0: 
      //printf("%s<%d>%s<%d>\n", "CHILD ", getpid(), " ppid: ", getppid()); 
      //sleep(1); 

      dup2(seedArray[i][0], STDIN_FILENO); 
      close(seedArray[i][0]); 

      dup2(scoreArray[i][1], STDOUT_FILENO); 
      close(scoreArray[i][1]);   

      sprintf(arg1,"%d",i); 

      execv("./shooter", args); 

      //shooter(i, seedArray[i][0], scoreArray[i][1]); 
      //exit(EXIT_SUCCESS); 
      break; 
     default: 
      //pid = wait(NULL); 
      pidArray[i] = pid; 
     } 
    } 


// SOME IRRELEVANT CODE HERE 


    int status; 
    for(i = 0;i < NUM_PLAYERS; i++) 
    { 
     wait(&status); 
    } 

    return 0; 
} 
+0

출력을 로그 파일과 동기화하면 응용 프로그램에서 로깅이 병목 현상을 일으킬 수 있습니다. –

답변

0

일부 명시적인 잠금 메커니즘이 필요합니다. 대안으로는 파일이나 공유 뮤텍스를 잠글 수 있습니다 (제한되지는 않음). 잠금 파일에 대한

: 공유 뮤텍스를 들어 File locks for linux

: 생각이 그것으로 공유 메모리와 장소 과정 공유 뮤텍스를 사용하는 것입니다 생각은

링크는 의미를 잠금 OS 파일을 사용합니다.

링크 : fork without exec, and pthread_mutex_t used by shared object

링크 : Semaphores and shared memory

0

당신은 출력 스트림에 flock()를 사용할 수 있습니다.

이처럼 사용

int fd = ... /* Use open or fileno() here. */ 

flock(fd, LOCK_SH); 

/* Write to fd here. */ 

flock(fd, LOCK_UN); 
0

당신은 임계 영역 내부의 기능을 넣어 동시의 printf 호출을 방지 할 수 있습니다. 이 섹션은 pthread 라이브러리에서 제공하는 공유 뮤텍스 또는 명명 된 세마포어 또는 이름없는 세마포어로 구현할 수 있습니다. 명명 된 세마포어 (가장 쉬운 방법)로 코드를 보호하려면 sem_open, sem_post, sem_wait 함수 및 sem_overview Linux 매뉴얼 페이지를 읽어보십시오.

관련 문제