我想在后台终端中无限期地运行程序,直到用户按下某个组合键(在任何时间点,而不仅仅是在终端提示符处)。
我当前的想法程序(如下)将生成一个线程,该线程将循环直到按下某个键,然后退出,但只能直接进入终端。我找不到一种可靠的方法来监听任何不必直接进入终端的键盘输入。
这是我当前的代码。我故意使用一个线程作为侦听器,因为我会让我的程序在线程侦听的同时继续执行其他操作。
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
void *listen_to_kb();
int main(void)
{
// Create thread that will listen to keyboard in the background
pthread_t id;
pthread_create(&id, NULL, listen_to_kb, NULL);
/*
Do some stuff here while thread is listening
*/
pthread_join(id, NULL);
return 0;
}
void *listen_to_kb()
{
// Listen indefinitely for key press
while (1) {
char c = getchar();
if (c == 'q') {
exit(0);
}
}
}
xbindkeys 将在按下给定键时运行脚本。创建一个脚本来终止正在运行的进程或在文件中设置一些标志以供正在运行的程序读取然后退出。
安装 xbindkeys,然后运行以下命令来填充配置文件。
xbindkeys --defaults > ~/.xbindkeysrc
在文件底部添加以下行,并将
gedit
替换为您的脚本。
"gedit"
m:0x10 + c:24
Mod2 + q
然后在终端中运行
xbindkeys
来启动该过程。您必须在脚本末尾运行 killall xbindkeys
才能停止此行为。
我在我的 Linux 22.04 机器上测试了这个。您的按键绑定可能会有所不同;如果是这样,请运行
xbindkeys -k
,按所需的键,并确保代码相同。