微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何在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()
输出之前被打印出来。在某些平台上,打印可能同时发生,从而导致字符混合或终端输出完全乱码。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。