不同的流程同时写出来

时间:2014-02-19 11:31:13

标签: c unix process fork wait

我们有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;
}

3 个答案:

答案 0 :(得分:0)

您需要有一些明确的锁定机制。替代方案包括(但不限于)锁定文件或共享互斥锁。

对于锁定文件:使用OS文件锁定语义的想法

链接:File locks for linux

对于共享互斥锁:想法是使用共享内存并将进程共享互斥锁放入其中。

链接:fork without exec, and pthread_mutex_t used by shared object

链接:Semaphores and shared memory

答案 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手册页的更多信息。