我们有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)
您需要有一些明确的锁定机制。替代方案包括(但不限于)锁定文件或共享互斥锁。
对于锁定文件:使用OS文件锁定语义的想法
对于共享互斥锁:想法是使用共享内存并将进程共享互斥锁放入其中。
链接:fork without exec, and pthread_mutex_t used by shared object
答案 1 :(得分:0)
您可以在输出流上使用flock()
。
像这样使用:
int fd = ... /* Use open or fileno() here. */
flock(fd, LOCK_SH);
/* Write to fd here. */
flock(fd, LOCK_UN);
答案 2 :(得分:0)
您可以通过将函数放在临界区中来防止同时进行printf调用。本节可以通过pthread库提供的共享互斥锁,也可以通过命名信号量或未命名的信号量来实现。如果您要通过命名信号量保护代码(最简单的方法),请阅读有关sem_open,sem_post,sem_wait函数和sem_overview Linux手册页的更多信息。