我有这个代码。我想做的是等待用户按“q”来结束程序。
.
...starting few threads, which use fflush(stdout) (just saying...)
.
char n = 0;
while (n != 'q') {
n = getchar(); //tried to use scanf() here as well
printf("%c", n);
}
...killing all threads...
return 0;
当我在正常的 Linux 环境中运行这个时,它工作正常。
当我在带有 debian jessie lite 发行版的 raspberry-pi 上启动时运行此程序时(我将程序的路径添加到/etc/rc.local),问题就开始了 - 它以无限循环结束,scanf
仍然返回 -1
和 getchar()
一些奇怪的字符,当我按 q
时,程序不会结束。 Ctrl+C 也不起作用,所以没有办法,如何结束程序。
有什么建议么? (至少如何杀死该程序...?)
编辑:让您了解该程序的作用。 带有此程序的Raspberry-pi连接到一些串行端口并转换和传输一些GPS数据。它应该“开箱即用”,无需任何键盘、鼠标或显示器。 = 只需将设备插入一些电缆,无需执行任何其他操作。 在某些情况下,有人希望查看树莓派上的日志文件,因此显然他需要停止该程序。
Edit2:当我对一些普通的 Raspbian 做同样的事情时,它也工作得很好。
更新:
我尝试调试它 - 将代码缩小到仅此
int main(void){
char n=0;
int x;
while (n != 'q'){
clearerr(stdin);
x=scanf("%c",&n);
printf("%c %d\n",n,x);
}
return 0;
}
将service start udev
添加到rc.local并尝试命令update.rc.d udev启用
启动时启动时树莓派上的输出仍然
-1
-1
-1
.
.
所以标准输入肯定有问题。
启动后和在其他系统上,输出显然是 q 1
(当我按“q”(并输入)时...)
当我尝试从/dev/tty
读取时,fopen()
返回NULL
确实需要帮助
最佳答案
编写此循环的惯用方法是:
int c;
while ((c = getchar()) != EOF && c != 'q'){
putchar(c);
}
您的实现无法检测文件结尾,并且将永远循环,打印有趣的字符,例如 ÿ
。
关于c - 为什么我在 Raspberry-Pi Jessie Lite 上启动时无法访问标准输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35601089/