<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>
"); //-->

博客專(zhuān)欄

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

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

發(fā)布人:電子禪石 時(shí)間:2022-03-29 來(lái)源:工程師 發(fā)布文章

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


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


#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;

}

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

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


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


具體的解釋可以參考: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


*博客內容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀(guān)點(diǎn),如有侵權請聯(lián)系工作人員刪除。

隔離器相關(guān)文章:隔離器原理


關(guān)鍵詞: linux

相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>