当前位置: 首页 > 知识库问答 >
问题:

在C中留下一个无限的time循环

傅俊德
2023-03-14

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

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

共有3个答案

陶星波
2023-03-14

创建一个while循环来侦听/读取特定文件中的布尔值,而不是无限while循环。可以编辑文件以退出循环。

尉迟京
2023-03-14

你可以这样做:

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
}

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

糜运良
2023-03-14

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

#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)。进程的默认操作是在收到信号时退出,但是您可以捕获信号并优雅地处理它。

 类似资料:
  • 进行无止境循环有多种可能性,我会选择以下几种: / / 是否有某种形式可以选择?现代编译器是在中间语句和最后一个语句之间做出了区别,还是意识到这是一个无止境的循环,完全跳过了检查部分? 编辑:正如前面提到的,我忘记了,但这样做的原因是我根本不喜欢它作为一个命令。

  • 这是一个类的简单程序,它以分钟为单位提示用户他或她淋浴的时间长度(作为正整数,根据需要重新提示),然后打印同等数量的水瓶(作为整数)。 假设淋浴器每分钟使用1.5加仑水(192盎司),塑料瓶大小为16盎司 我的do-while循环成功地拒绝了负数和0,但是,如果我输入“foo”这样的文本,当提示输入淋浴的长度(以分钟为单位)时,程序将进入无限循环,永远运行该循环并打印“How long is yo

  • 我目前有2个pthread正在运行,我想等待其中一个结束,以便我的程序继续运行。 在我的pthreads中,我有一个可以为真或假的变量(它是一个全局变量)。创建线程后(一个在cin中请求输入,一个等待10秒,如果达到10秒,它会杀死“cin”线程并结束自己,如果检测到cin,“cin”线程会杀死“计时器”线程),我希望我的程序等待。当每个线程结束时,它们将变量“stoptimer”置为真。 首先,

  • 问题内容: 请看下面的Java 无限循环。它导致其下面的语句的编译时错误。 以下相同的无限循环可正常工作,并且不会发出任何错误,其中我只是用布尔变量替换了条件。 同样在第二种情况下,循环之后的语句显然不可访问,因为布尔变量为true,但编译器根本没有抱怨。为什么? 编辑:显然,以下版本的卡在无限循环中,但是即使循环中的条件始终存在,因此循环下面的语句也不会对该语句下的语句发出任何编译器错误,因此循

  • 我正在尝试编写一个线程,该线程将在我的主程序的后台运行,并监视某些内容。在某个时候,主程序应该向线程发出安全退出的信号。下面是一个以固定间隔将本地时间写入命令行的最小示例。 当“on”变量没有通过引用传递时,此代码会编译并产生预期的结果,只是线程永远不会终止。一旦变量通过引用传递,我就会收到编译器错误 您能建议一种修复此代码的方法吗? 额外的问题:哪里出了问题,为什么它可以与std::ref一起工

  • 问题在代码的注释中,很抱歉,我认为它更整洁,因为流程很重要,我想。。。 //*这是来自Oracle:(https://docs.oracle.com/javase/6/docs/api/java/util/Scanner.html#hasNextInt()) ”hasNextInt 公共布尔值hasnetint() 如果此扫描仪输入中的下一个标记可以使用nextInt()方法解释为默认基数中的in