簡體   English   中英

C 非阻塞鍵盤輸入塊在運行級別 3 (Linux)

[英]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 窗口?),如果有人能解釋為什么會發生這種情況,我們將不勝感激。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM