2014-02-19 76 views
0

我們的子進程NUM_PLAYERS,和他們每個人的輸出其ID喜歡不同的進程寫出同時

player 5: I scored 0 (PID = 411160) 

但問題是,所有的人都同時寫出因此它的輸出一團糟。

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

你可以在輸出流上使用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手冊頁的更多信息。

相關問題