在 C 中的分叉进程内的 scanf 之前调用 Printf
Printf called before scanf inside forked process in C
我在使用 fork() 创建的新进程中使用 scanf 时遇到了问题。 scanf 没有被阻塞,所以 printf 被一遍又一遍地调用。
以下是代码示例:
int main(int argc,char *argv[])
{
switch(fork()) {
case 0:
while(1) {
char buffer[100];
scanf("%s",buffer);
printf("Input was %s\n",buffer);
}
}
return 0;
}
有人知道如何解决这个简单的问题吗? (部分代码缺失,针对这个问题我将代码缩减到了最低限度)
问题出在您为制作最小示例而注释掉的代码中,运行这工作得很好
#include <stdio.h>
int main(int argc,char *argv[])
{
switch(fork()) {
case 0:
while(1) {
char buffer[100];
scanf("%s",buffer);
printf("Input was %s\n",buffer);
}
break;
default:
sleep(100);
break;
}
return 0;
}
我的猜测是,在你的 fork
调用周围的完整代码中,还有一些文件关闭以创建子进程并将其与终端分离——这是标准输入的关闭和与让你 scanf 失败的终端。
真正的问题是 parent 立即处理 returns。 shell 然后采用标准输入来读取新命令。您可以在 parent:
中通过短暂的睡眠轻松演示它
switch(fork()) {
case 0:
while(1) {
char buffer[100];
int cr = scanf("%s",buffer);
printf("Input was %s (%d)\n",buffer, cr);
if (cr <= 0) break;
}
}
break;
default:
sleep(5);
printf("Done\n");
}
在parent休眠的5秒内,您可以正常与child互动。然后当 parent 退出时, child 的输入关闭并且 scanf
returns -1.
我在使用 fork() 创建的新进程中使用 scanf 时遇到了问题。 scanf 没有被阻塞,所以 printf 被一遍又一遍地调用。
以下是代码示例:
int main(int argc,char *argv[])
{
switch(fork()) {
case 0:
while(1) {
char buffer[100];
scanf("%s",buffer);
printf("Input was %s\n",buffer);
}
}
return 0;
}
有人知道如何解决这个简单的问题吗? (部分代码缺失,针对这个问题我将代码缩减到了最低限度)
问题出在您为制作最小示例而注释掉的代码中,运行这工作得很好
#include <stdio.h>
int main(int argc,char *argv[])
{
switch(fork()) {
case 0:
while(1) {
char buffer[100];
scanf("%s",buffer);
printf("Input was %s\n",buffer);
}
break;
default:
sleep(100);
break;
}
return 0;
}
我的猜测是,在你的 fork
调用周围的完整代码中,还有一些文件关闭以创建子进程并将其与终端分离——这是标准输入的关闭和与让你 scanf 失败的终端。
真正的问题是 parent 立即处理 returns。 shell 然后采用标准输入来读取新命令。您可以在 parent:
中通过短暂的睡眠轻松演示它switch(fork()) {
case 0:
while(1) {
char buffer[100];
int cr = scanf("%s",buffer);
printf("Input was %s (%d)\n",buffer, cr);
if (cr <= 0) break;
}
}
break;
default:
sleep(5);
printf("Done\n");
}
在parent休眠的5秒内,您可以正常与child互动。然后当 parent 退出时, child 的输入关闭并且 scanf
returns -1.