[英]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.