自昨晚以来,我一直坚持这个问题,我希望第二双新眼睛会有所帮助。
问题是,如果在userIn
函数中输入了无效输入(任何不是1-99之间的数字),main
中while循环结束时的测试printf打印“ERR = 1”,再次调用while循环和userIn
。到目前为止一切顺利,但是当输入有效输入时,while循环结束时的测试printf打印“ERR = 0”,然后程序挂起。测试printf说“HELLO”永远不会被打印出来。
有关为何最受欢迎的任何建议。
代码:
#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("\033[1A\033[K");
printf("ERR = %i\n",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("\033[0;31mNamed pipe doesn't exist, %i not passed.\n\n\033[0m",x);
return 0;
}
答案 0 :(得分:2)
与你的直觉相反,程序在 printf("HELLO");
行之后冻结。由于printf中没有换行符,HELLO
会被缓冲,并且不会立即刷新到终端。
是否有一个过程从你那管道的另一端读取?
答案 1 :(得分:1)
如果我在系统上运行代码,输出如下:
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
语句的输出被缓冲,并且对命名管道的写入是阻塞的,因此输出永远不会被刷新。在printf中添加\n
可能会按预期显示它。