while循环中的scanf

while循环中的scanf,c,while-loop,fork,scanf,C,While Loop,Fork,Scanf,在此代码中,scanf仅工作一次。我做错了什么 #include <stdio.h> #include <unistd.h> int main() { int i = 1; if (! fork()) { while(i) { printf("Enter i"); scanf("%d", &i); fflush(stdin);

在此代码中,
scanf
仅工作一次。我做错了什么

#include <stdio.h>
#include <unistd.h>

int main()
{
    int i = 1;
    if (! fork())
    {
        while(i)
        {
            printf("Enter i");
            scanf("%d", &i);
            fflush(stdin);
            fflush(stdout);
        }
    }
    else
    {
        printf("Parent\n");
    }
    return(0);
}
#包括
#包括
int main()
{
int i=1;
如果(!fork())
{
而(i)
{
printf(“输入i”);
scanf(“%d”、&i);
fflush(stdin);
fflush(stdout);
}
}
其他的
{
printf(“父项”);
}
返回(0);
}

尝试检查i>0。

首先,我尝试提取导致问题的最简单代码(很长时间没有使用C/scanf)。没有
分叉的代码可以正常工作。谷歌搜索“fork scanf”

在fork之后,输入流被关闭。所以scanf进入了一个糟糕的状态。下面的程序是对您的程序的轻微修改。它打印“关闭流”

#包括
#包括
int main()
{
int i=1;
如果(!fork())
{
而(i)
{
printf(“输入i”);
int j=scanf(“%d”,&i);//已更改
如果(j==EOF){//added
printf(“流关闭”);//已添加
返回1;//已添加
}//增加
fflush(stdin);
fflush(stdout);
}
}
其他的
{
printf(“父项”);
}
返回(0);
}

如果看不到您提供的输入,就有点难说了。如果它在没有
fork
的情况下工作,那么它可能是Amit描述的冲突。不过,还有两件事:

  • 不要使用
    scanf

  • fflush(stdin)
    是未定义的行为。不要这样做

  • 从comp.lang.c常见问题解答:


    已经建议您。如果您觉得必须使用
    scanf
    ,您确实应该检查返回值,以确定在转换之前是否发生了输入错误

    还需要注意的是,您不应该通过
    fflush
    刷新
    stdin
    ,因为它调用未定义的行为。如果您觉得必须刷新
    stdin
    ,您可能需要参考的答案

    如果输入了“1234”等无效值,
    scanf
    将接受“1”,输入流中将保留“234/n”。由于
    fflush(stdin)
    不能保证工作,因此对
    scanf
    的后续调用将一次又一次地拒绝相同的“,”,永远不会取得任何进展。如果将返回值检查为零(表示早期匹配失败),则可以避免此无限循环。在再次调用
    scanf
    之前,还需要从输入流中删除无效字符



    请参见

    在父进程返回后,它将控制权交还给shell,shell可以自由关闭其
    stdin
    。即使
    stdin
    仍然有效并处于活动状态,用户也会收到令人困惑的shell提示

    要保留子项对stdin/out的访问,需要暂停父项终止,直到子项完成。使用
    等待
    或相关功能

    #include <sys/wait.h>
    

    这修复了我机器上的错误。我不是Unix文件描述符语义方面的专家,但看起来生成的程序可能是可移植的。为什么要这样做是另一回事……

    scanf()是邪恶的。不要用它。你到底为什么要用
    fork()
    ?它不会直接影响逻辑,但是……您的子进程正在读取标准输入,而您的父进程正在打印和退出(不等待子进程)。这孩子是孤儿。您确定它不仅仅是坐在后台,与shell争论谁可以读取下一行数据(并丢失数据)?除了“fork()”,代码显示了有趣的行为。此时会出现提示(在键入数据之前没有空格)。它循环;重复几次。未显示读取值。输入EOF,程序进入不确定循环。不好的。始终检查scanf()的返回!POSIX文档(进程终止的后果):“进程的终止不会直接终止其子进程。在某些情况下,发送如下所述的SIGHUP信号会间接终止子进程。[…]如果该进程是一个控制进程,SIGHUP信号应发送到属于调用进程的控制终端的前台进程组中的每个进程。“当您使用‘fork()’时,这两个进程几乎相同,尤其是它们打开的文件相同。子项的标准输入未关闭。
    #include <sys/wait.h>
    
    else {
        printf( "parent\n" );
        wait( NULL );
    }