Linux下C C 程式處理Ctrl C的例子

2021-08-11 12:02:29 字數 937 閱讀 5724

本文**

遇到乙個場景:程式要讀入檔案,而使用者在使用檔案時是用/dev/urandom重定向作為輸入的。(好吧這個使用者就是測試我們作業的助教……)而/dev/urandom顯然是沒有eof的,只有用ctrl+c的方法結束輸入。但是ctrl+c也會同時結束程式,造成不用刻**的結果。

因此,程式必須設法獲知ctrl+c的發生並進行處理。在linux下,按下ctrl+c後,程式會收到乙個訊號sigint;這時作業系統缺省會結束程式。如果程式不想被預設處理,就要設定對sigint訊號的處理函式(handler)。下面是乙個簡單的例子:

#include #include #include // signal functions

volatile sig_atomic_t flag = 0;

static void my_handler(int sig)

int main()

return 0;

}

如上面程式所示,一般是在乙個迴圈中檢測乙個標誌變數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。

Linux下C C 程式編譯

在編譯之前我們需要在系統裡安裝g gcc,它們就是linux下的c c的編譯器。如下 sudo apt get install build essential sudo apt get install gcc sudo apt get install g 好,現在我們在文字編輯器裡寫乙個c的簡單的程...

linux下編譯C C 程式

c c 的速度是python和perl所無法比擬的,尤其對於處理超大的生物資訊學檔案來說。最近在寫乙個最簡單的fastq cut工具,python簡直慢到不能忍,8g的fastq.gz檔案的cut需要6 7個小時,而c 則只需要15 20min,簡直就不在乙個量級。當然,聽說python有個cpyt...

linux系統下通過GCC編譯C C 程式

在這裡插入描述 三 gcc編譯c c 的過程 通過命令gcc v檢視當前的gcc版本 gcc v如下所示 當出現如下問題 command gcc not found,but can be installed with sudo apt install gcc 解決辦法 通過sudo apt inst...