如何在c中同步while循环内的进程

时间:2011-04-19 00:11:19

标签: c linux process fork

我正在经历一个相当困境:

我有以下程序结构:

char* input = (char *)malloc(sizeof(char));
input = "CONTINUE";

while(strcmp(input, "EXIT") != 0 )
{
    printf("%s", "prompt: ");
    scanf("%s", input);

    if( strcmp(input, "test") == 0 )
    {
        pid_t childPid;
        switch(childPid = fork())
        {
            case -1:
                printf("%s", "Error");
                break;
            case 0:
                foo(input);
                break;
        }
    }
    else if(/.../)
    {
    }
    else
    {
        input = "EXIT";
    }

}

void foo(char* input)
{
   printf("%s %s", "printing" input);
}

所以问题是当循环执行时它第一次输出“prompt:”, 然后它再次打印“prompt:”,最后来自if语句的子进程打印其输出。

这就像子进程不同步或某些东西,我无法弄清楚是什么导致额外的“提示:”第二次打印。这是一个示例输出:

prompt: test                  //typed "test"
prompt:                       //Where is this comming from?
printing test
prompt:                       //new iteration of loop expecting input

1 个答案:

答案 0 :(得分:3)

fork()导致子进程被创建为父进程的精确副本,但也允许父进程继续执行。

您的代码在成功生成子代码时在父代中不执行任何操作(fork返回一个大于0的数字,表示子代的进程ID;您的代码不会处理该返回)。因此,父级返回到while循环的开头并再次打印“prompt”。

子调用foo(fork返回0),但之后你的代码只是从switch语句中断。在那之后,孩子遵循与父母完全相同的代码路径,因此它也会打印“提示”,然后执行scanf

你想做的事情可能更多的是这些:

childPid = fork();
if (childPid < 0)
{
    perror("fork()");
}
else if (childPid == 0)
{
    foo(input);
    exit(0); // terminate the child process
}
else
{
    waitpid(childPid, NULL, 0); // suspend the parent until the child exits
}

由于您printf来自两个进程,您可能希望暂停父进程,直到子进程完成(使用waitpid)。否则,“提示”可能会在foo()的输出之前打印出来。在某些平台上,打印可能同时发生,导致混合字符或完全乱码的终端输出。