在 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.