c - 为什么我在 Raspberry-Pi Jessie Lite 上启动时无法访问标准输入?

标签 c scanf stdin raspberry-pi2 getchar

我有这个代码。我想做的是等待用户按“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 仍然返回 -1getchar() 一些奇怪的字符,当我按 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/

相关文章:

c - 填充和打印二维数组

c - 从 stdin 读取输入到指针数组中直到 EOF,但没有任何输出?

c - 当我有类似 "executable < example_file"或“cat xyz | 可执行文件?”时如何检查不正确的标准输入?

c - 在 c shell 中使用 execvp 出现段错误

C:我无法让这个示例税收计划发挥作用

c - 为什么我们需要地址运算符来访问二维字符串元素

c - 使用 fgets 读取表达式并使用 sscanf 获取数值

C 代码卡在 scanf() 语句

c - C中的按位运算伪造文件内容

Java:在单独的进程中运行 Callable