簡體   English   中英

在C中留下無限循環

[英]Leaving an infinite while loop in C

我有一個循環,不斷從我的串口讀取。 循環是無限的,所以我知道停止程序的唯一方法是使用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
}

這將捕獲按CTRL-C生成的SIGINT信號,並通過將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循環,它監聽/讀取特定文件中的boolean值。 您可以編輯該文件以退出循環。

使用ctrl + C實際上會中斷您的程序。 為了避免這種情況

1)使用變量並在每次循環迭代中檢查其狀態。

int  shouldExit  = 0;

----
----
---
while (your_condition){
  if(shouldExit == 1) {
     break;
  }

  // Your loop logic here
}

然后異步設置變量

shouldExit = 1 

當你想退出。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM