运行 级别 3 (Linux) 上的 C 非阻塞键盘输入块
C non-blocking keyboard input blocks on run level 3 (Linux)
我有一段读取键盘输入的代码(用于调试目的),在 Ubuntu 18.04 上用 C 实现。由于其他进程必须 运行 在同一个线程上,它被初始化为非阻塞。
当我在 运行 级别 3 上尝试 运行 我的应用程序时,它会在尝试读取键盘字符时阻塞。当我 运行 运行 级别 5 上的应用程序时,不会发生此行为。
有没有人知道为什么这两个 运行 级别之间的行为不一致?
这是代码(未显示:其中读取操作由应用程序的主循环调用):
#include <errno.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <termios.h>
#include <unistd.h>
static int fd;
int kbd_initModule()
{
fd = open("/dev/tty", O_NONBLOCK | O_NOCTTY);
if(fd < 0)
{
ERROR("Unable to open keyboard: %d", fd);
return fd;
}
else
{
return 0;
}
}
int kbd_deinitModule()
{
close(fd);
return 0;
}
int kbd_getEvent()
{
uint8_t buf[1];
int tmp = read(fd, buf, sizeof(buf));
if(tmp == -1)
{
ERROR("%s", strerror(errno));
return -1;
}
else
{
return buf[0];
}
}
我可以回答任何问题并提供更多详细信息。
其他详细信息:
- 启动应用程序:运行 5 级:
sudo ./app
; 运行 级别 3:sudo xinit ./app
(应用程序中有 GUI 组件,因此 X 服务器必须在 运行 级别 3 上启动 - 如果有人对此有更多了解,那将会很好)。
更新: 结果表明,如果您在 运行 级别 3 上初始化当前 tty 设备,则它不起作用。初始化为特定的 tty 设备(在本例中为 tty3)可解决问题。
不太确定为什么会这样(也许 运行 级别 3 上的默认 tty 是 X window?),如果有人能解释为什么会这样,我们将不胜感激。
我有一段读取键盘输入的代码(用于调试目的),在 Ubuntu 18.04 上用 C 实现。由于其他进程必须 运行 在同一个线程上,它被初始化为非阻塞。
当我在 运行 级别 3 上尝试 运行 我的应用程序时,它会在尝试读取键盘字符时阻塞。当我 运行 运行 级别 5 上的应用程序时,不会发生此行为。
有没有人知道为什么这两个 运行 级别之间的行为不一致?
这是代码(未显示:其中读取操作由应用程序的主循环调用):
#include <errno.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <termios.h>
#include <unistd.h>
static int fd;
int kbd_initModule()
{
fd = open("/dev/tty", O_NONBLOCK | O_NOCTTY);
if(fd < 0)
{
ERROR("Unable to open keyboard: %d", fd);
return fd;
}
else
{
return 0;
}
}
int kbd_deinitModule()
{
close(fd);
return 0;
}
int kbd_getEvent()
{
uint8_t buf[1];
int tmp = read(fd, buf, sizeof(buf));
if(tmp == -1)
{
ERROR("%s", strerror(errno));
return -1;
}
else
{
return buf[0];
}
}
我可以回答任何问题并提供更多详细信息。
其他详细信息:
- 启动应用程序:运行 5 级:
sudo ./app
; 运行 级别 3:sudo xinit ./app
(应用程序中有 GUI 组件,因此 X 服务器必须在 运行 级别 3 上启动 - 如果有人对此有更多了解,那将会很好)。
更新: 结果表明,如果您在 运行 级别 3 上初始化当前 tty 设备,则它不起作用。初始化为特定的 tty 设备(在本例中为 tty3)可解决问题。
不太确定为什么会这样(也许 运行 级别 3 上的默认 tty 是 X window?),如果有人能解释为什么会这样,我们将不胜感激。