簡體   English   中英

處理信號

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

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