背景:
我是一个相对缺乏经验的开发人员,试图编写与 PCI 运动 Controller 接口(interface)的软件。我在 Ubuntu Linux 18.04 上使用 C(用 gcc 编译)。
我正在编写的程序需要定期检查运动 Controller 发送的未经请求的状态消息(大约每秒一次)并在终端屏幕上显示它找到的任何消息(为此我正在使用 ncurses
库)。
我有什么:
现在,为了做到这一点,我正在调用一个函数来检查 while 循环中的未经请求的消息。代码大致类似于:
while (1)
{
// check for messages from PCI and store them in a traffic buffer
checkForMessages(PCIconnection, trafficBuffer);
// output the traffic buffer to the screen
printf("%s", trafficBuffer);
}
我需要什么:
我需要以允许他们结束循环的方式提示用户输入。例如,用户可以输入 end
导致循环停止,程序继续。
问题:
我不知道有什么方法可以在不将 fgets
放入 while 循环的情况下实现此目的,这会导致程序停止并等待用户在每次循环迭代中输入内容。
我一直在寻找解决方案,但一直找不到关于如何实现我需要的功能的讨论。打开一个新线程或进程似乎是朝着正确方向迈出的一步?
如果我目前所做的是糟糕的做法,我愿意完全重构我的代码。
感谢您的帮助!
最佳答案
您的任务需要 event loop基于select
或epoll
。它会等待的一个事件是用户输入 - 当 STDIN_FILENO
准备好读取时。另一个是当您需要轮询 Controller 时的 1 秒周期性计时器。
有很多库为您实现了事件循环,这样您就可以专注于需要处理哪些事件以及如何处理。 libevent
是最古老、功能丰富和流行的一种。
关于c - C 程序如何在 Linux 环境中同时执行其他操作的同时轮询用户输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55660630/