[英]Handle signals in ncurses
我正在使用ncurses用C編寫程序。我正在嘗試處理CRTL C信號。 在我的代碼中,該信號已被捕獲並處理,但是程序未正確終止。 可能是我退出ncurses的方式嗎?
//handle SIGINT signal
void handle_signal(int signal){
if(signal == SIGINT){
clear();
mvprintw(3,3,"A SIGNAL WAS ENCOUNTERED");
refresh();
sleep(1/2);
exit(0);
} //close if statement
}//close handle_signal() function
沒有進一步的研究:如果curses
函數實際上是信號安全的,我會感到非常驚訝。 通常最好的做法是使信號處理程序保持最小狀態,理想情況下只是設置一個標志。 因此,您應該這樣解決您的問題:
static volatile sig_atomic_t interrupted = 0;
在您的信號處理程序中:
if (signal == SIGINT)
{
interrupted = 1;
}
主循環中的某處:
if (interrupted)
{
clear();
mvprintw(3,3,"A SIGNAL WAS ENCOUNTERED");
refresh();
sleep(1);
endwin();
exit(0);
}
注意您的代碼沒有在任何地方調用endwin()
,這是將終端恢復到正常狀態所必需的。
如initscr
手冊頁所述 ,ncurses為SIGINT
安裝處理程序。
處理程序嘗試在退出時清理屏幕。 盡管它通常可以按預期運行,但存在一些局限性:
如果在initscr
(或newterm
)之前設置處理程序,則不會調用該處理程序。 如果之后設置處理程序,則必須考慮可以安全地在信號處理程序中調用的函數的各種限制。
ncurses對SIGINT
的處理考慮了以下事實:它通常會使用的某些功能並不安全,並且在收到信號時會使用不同的策略(這可能不是100%可靠,但是有所改進)。
您的信號處理程序不考慮任何因素,例如,ncurses可以調用malloc
來處理所需的一些額外輸出緩沖,並且“不起作用”,因為malloc
並不是安全的函數。
進一步閱讀:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.