2014-02-19 25 views
0

Мы NUM_PLAYERS дочерних процессов, и каждый из них выводит свой идентификатор, какРазличные процессы пишущие одновременно

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

Вам необходимо иметь явный механизм блокировки. Альтернативы включают (но не ограничиваясь) в файл блокировки или общий мьютекс.

Для файла блокировки: идея использовать файл ОС блокировок семантики

Ссылка: File locks for linux

Для общего мьютекса: Идея заключается в том, чтобы использовать общий процесс памяти и места общего семафор в него.

Ссылка: 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 и страницах руководства Linux sem_overview Linux.