while循环在输入有效输入后挂起程序?

自从昨晚开始,我一直在关闭这个问题,我希望第二个新的眼睛会有所帮助。

问题,如果一个无效的输入在输入userIn函数(任何不1-99之间的数字)在while循环的端部的测试的printf main打印“ERR = 1”时,while循环和userIn再次被调用。 到目前为止这样好,但是当输入一个有效的输入时,while循环结束时的测试printf打印“ERR = 0”,然后程序挂起。 说“HELLO”的测试printf永远不会被打印。

任何建议,为什么是最受欢迎的。

代码:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

void userIn (int *x)
    {
    char b;
    printf("Please enter a new value for Vm: ");
    scanf(" %i",x);
    while (((b=getchar())!='n')&&(b!=EOF));
    return; 
    }
int main (void)
    {
    int  fd, x, err;
    char *npipe = "/tmp/fms",
         input[3];
    struct stat info;
    printf("n");

    //get user input
    err = 1;
    while (err)
        {
        userIn(&x);
        if (x > 0 && x < 100) err = 0;
        //else printf("33[1A33[K");

        printf("ERR = %in",err);//TEST PRINTF
        }
    printf("HELLO");//TEST PRINTF

    //if pipe exists
    if ( (!lstat(npipe,&info)) && (S_ISFIFO(info.st_mode)) )
        {
        sprintf(input,"%i",x);
        //write user input to named pipe created by 'parent.c'
        fd = open(npipe, O_WRONLY);
        write(fd, input, sizeof(input));
        close(fd);
        }
    else printf("33[0;31mNamed pipe doesn't exist, %i not passed.nn33[0m",x);
    return 0;
    }

如果我在我的系统上运行你的代码,输出如下所示:

Please enter a new value for Vm: 101
ERR = 1
Please enter a new value for Vm: 1
ERR = 0
HELLONamed pipe doesn't exist, 1 not passed.

也就是说,循环完全在您认为应该的时候退出。 当然,代码会立即退出,因为我的系统中不存在/tmp/fms

但是,如果我创建/tmp/fms ,那么我会看到:

Please enter a new value for Vm: 1
ERR = 0

...并且没有额外的输出。 这是因为来自printf语句的输出被缓冲,并且写入命名管道被阻塞,所以输出永远不会被刷新。 将n添加到您的printf可能会按照您的预期显示它。


与你的直觉相反,该程序在printf("HELLO");之后的某处冻结printf("HELLO"); 线。 由于在printf中没有换行符, HELLO会被缓存起来并且不会立即刷新到终端。

是否有从你的管道另一端读取的过程?

链接地址: http://www.djcxy.com/p/72189.html

上一篇: While loop hangs program after valid input is entered?

下一篇: c Infinite loop error