如何在c的while循环内同步处理

| 我遇到了一个难题: 我有以下程序结构:
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:\”,最后if语句的子进程打印其输出。 就像子进程不同步或什么一样,我无法弄清楚是什么原因导致第二次额外打印“提示:”。这是一个示例输出:
prompt: test                  //typed \"test\"
prompt:                       //Where is this comming from?
printing test
prompt:                       //new iteration of loop expecting input
已邀请:
fork()
导致将子进程创建为父级的精确副本,但也允许父级继续执行。 成功生成子代时,您的代码对父代不执行任何操作(fork返回大于0的数字,指示该子代的进程ID;该返回不由您的开关处理)。因此,父级返回while循环的开始并再次打印“提示”。 子级调用foo(fork返回0),但是此后,您的代码仅从switch语句中断。此后,子代将遵循与父代完全相同的代码路径,因此它还会打印\“ prompt \”,然后执行
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
}
由于您在这两个过程中都处于“ 5”状态,因此您可能想暂停父级,直到子级完成为止(使用“ 6”)。否则,“提示”很可能会在
foo()
输出之前被打印出来。在某些平台上,打印可能同时发生,从而导致字符混合或终端输出完全乱码。

要回复问题请先登录注册