在C中留下无限循环

cap*_*com 3 c while-loop

我有一个循环,不断从我的串口读取.循环是无限的,所以我知道停止程序的唯一方法是使用Ctrl+C.这个解决方案的问题,我怀疑也引起了其他问题,就是当我使用时Ctrl+C,我的程序突然结束.在程序结束时,我关闭了与我正在访问的串口的文件描述符的连接,但我认为我的程序没有达到那个因为我使用Ctrl+C命令,这只是停止程序的确切位置.

有没有办法让我创建无限的while循环,并在我想要的时候退出,但同时,保持执行它下面的代码的能力?

Art*_*Art 10

试试这个,看看会发生什么:

#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;
}
Run Code Online (Sandbox Code Playgroud)

Ctrl-C向您的进程发送信号(SIGINT).该过程的默认操作是在获取它时退出,但您可以捕获信号并优雅地处理它.

  • 在信号处理程序期间,处理器状态和内存是不确定的。“易失性”不会阻止竞争条件(它*永远不会*这样做),但它确保变量不会被缓存,而是在每次使用时读取(即对“易失性”变量禁用某些编译器优化)。该标准明确规定从信号处理程序访问的非局部变量应该是“易失性”的,并且它们的初始状态是未指定的。 (2认同)

Zon*_*eur 7

你可以这样做:

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
}
Run Code Online (Sandbox Code Playgroud)

这将捕获SIGINT按CTRL-C生成的信号,并通过设置g_running为中断循环FALSE.然后执行清理代码

  • `g_running`必须是`sig_atomic_t volatile`类型或另一种无锁,原子(和volatile,IIRC)类型,否则你有UB,按照标准. (2认同)