我有一个不断从我的串口读取的循环。循环是无限的,所以我知道停止程序的唯一方法是使用Ctrl+C
. 这个解决方案的问题是,我怀疑它也会导致其他问题,当我使用 时Ctrl+C
,我的程序会突然结束。在程序结束时,我关闭了与我正在访问的串行端口的文件描述符的连接,但我认为我的程序永远不会到达那个位置,因为我使用了该Ctrl+C
命令,这只是将程序准确地停止在它所在的位置.
有没有办法让我创建无限的while循环,并在我想要的时候退出,但同时保持执行它下面的代码的能力?
我有一个不断从我的串口读取的循环。循环是无限的,所以我知道停止程序的唯一方法是使用Ctrl+C
. 这个解决方案的问题是,我怀疑它也会导致其他问题,当我使用 时Ctrl+C
,我的程序会突然结束。在程序结束时,我关闭了与我正在访问的串行端口的文件描述符的连接,但我认为我的程序永远不会到达那个位置,因为我使用了该Ctrl+C
命令,这只是将程序准确地停止在它所在的位置.
有没有办法让我创建无限的while循环,并在我想要的时候退出,但同时保持执行它下面的代码的能力?
试试这个,看看会发生什么:
#include <unistd.h>
#include <stdio.h>
#include <signal.h>
volatile sig_atomic_t stop;
void
inthand(int signum)
{
stop = 1;
}
int
main(int argc, char **argv)
{
signal(SIGINT, inthand);
while (!stop)
pause();
printf("exiting safely\n");
return 0;
}
Ctrl-C 向您的进程发送一个信号 (SIGINT)。进程的默认操作是在收到信号时退出,但您可以改为捕获信号并优雅地处理它。
你可以这样做:
sig_atomic_t volatile g_running = TRUE;
void sig_handler(int signum)
{
if (signum == SIGINT)
g_running = FALSE;
}
int main()
{
signal(SIGINT, &sig_handler);
while (g_running)
{
//your code
}
//cleanup code
}
这将捕获SIGINT
通过按 CTRL-C 生成的信号并通过设置g_running
为来中断循环FALSE
。然后执行您的清理代码
使用控制 while 循环的变量,例如while(running)
. 只需将此变量异步设置为 false 即可退出循环。
例子:
volatile int running = 1;
while(running) {
/* Your code */
}
所以另一个代码,比如说一个回调函数,就是这样做的
running = 0;
您可以将此回调设置为拦截 SIG_TERM(默认为 Ctrl-C)或您选择的任何信号(不发送到进程的 SIG_KILL 除外)。
而不是无限的while循环,创建一个while循环来监听/读取特定文件中的布尔值。您可以编辑文件以退出循环。
使用 ctrl + C 实际上会中断您的程序。为了避免这种情况
1)使用变量并在每次循环迭代中检查其状态。
int shouldExit = 0;
----
----
---
while (your_condition){
if(shouldExit == 1) {
break;
}
// Your loop logic here
}
然后异步设置变量
shouldExit = 1
当你想退出时。