博客專欄

        EEPW首頁 > 博客 > Linux下C/C++程序處理Ctrl+C的例子

        Linux下C/C++程序處理Ctrl+C的例子

        發布人:電子禪石 時間:2022-03-29 來源:工程師 發布文章

        遇到一個場景:程序要讀入文件,而用戶在使用文件時是用/dev/urandom重定向作為輸入的。(好吧這個用戶就是測試我們作業的助教……)而/dev/urandom顯然是沒有EOF的,只有用Ctrl+C的方法結束輸入。但是Ctrl+C也會同時結束程序,造成不用刻預測的結果。


        因此,程序必須設法獲知Ctrl+C的發生并進行處理。在Linux下,按下Ctrl+C后,程序會收到一個信號SIGINT;這時操作系統默認會結束程序。如果程序不想被默認處理,就要設置對SIGINT信號的處理函數(Handler)。下面是一個簡單的例子:


        #include <stdio.h>

        #include <stdlib.h>

        #include <signal.h> // signal functions

        volatile sig_atomic_t flag = 0;

        static void my_handler(int sig){ // can be called asynchronously

          flag = 1; // set flag

        }

         

        int main(){

          // Register signals 

          signal(SIGINT, my_handler); 

          //      ^          ^

          //  which-signal   |-- which user defined function registered

          while(1)  

            if(flag){ // my action when signal set it 1

                printf("\n Signal caught!\n");

                printf("\n default action it not termination!\n");

                flag = 0;

            }     

          return 0;

        }

        (來源:http://stackoverflow.com/questions/17766550/ctrl-c-interrupt-event-handling-in-linux)

        如上面程序所示,一般是在一個循環中檢測一個標志變量flag,而這個flag只在信號處理函數中改變。在這里,my_handler()函數會在Ctrl+C按下后被調用,并設置flag。注意,由于我們自己設置了Ctrl+C的處理函數,系統就不會再按默認行為結束程序了。因此flag的變化會在循環中被檢測到,并作出響應。


        需要注意的是,網上很多例子中出于演示的方便,在消息處理函數中使用printf()。這樣是不安全的:設想程序在正常調用printf的過程中收到了Ctrl+C,那么信號處理函數就會再調用一次printf,這有有造成錯誤的可能。有一些函數經過專門的設計可以安全地在信號處理函數中使用。


        具體的解釋可以參考:Matthew N, Stones R. Beginning Linux Programming[M]. John Wiley & Sons, 2011. 中的 Chapter 11: Processes and Signals。



        ————————————————

        原文鏈接:https://blog.csdn.net/THU_Wm/article/details/41191869


        *博客內容為網友個人發布,僅代表博主個人觀點,如有侵權請聯系工作人員刪除。

        隔離器相關文章:隔離器原理


        關鍵詞: linux

        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 湟中县| 玉门市| 靖安县| 雷州市| 丰城市| 子长县| 北票市| 晋宁县| 东源县| 夹江县| 饶阳县| 黑龙江省| 新蔡县| 邯郸市| 金湖县| 桐乡市| 临邑县| 临海市| 金寨县| 巴彦县| 伽师县| 桃园市| 岳阳市| 金乡县| 金寨县| 酒泉市| 武冈市| 藁城市| 安阳市| 南投市| 石城县| 大宁县| 三门峡市| 乐清市| 金阳县| 贵德县| 宜兴市| 桐城市| 宣城市| 吴忠市| 房产|