我正在经历一个相当困境:
我有以下程序结构:
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
答案 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()
的输出之前打印出来。在某些平台上,打印可能同时发生,导致混合字符或完全乱码的终端输出。