訊號是系統響應某些狀況而產生的事件,程序在接受到訊號時會採取相應的行動。訊號可以明確地由乙個程序產生傳送到另外乙個程序,用這種辦法傳遞資訊或協調操作行為。
程序可以生成訊號、捕捉並相應訊號或遮蔽訊號。訊號的名稱是在標頭檔案signal.h裡定義。下面我列出一部分,如下:
訊號名稱 說明
sigalrm 警告鐘
sighup 系統結束通話
sigint 終端中斷
sigkill 停止程序(此訊號不能被忽略或捕獲)
sigpipe 向沒有讀者的管道寫資料
sigquit 終端退出
sigterm 終止
如果程序接收到上表中的某個訊號但實現並沒有安排捕捉它,程序就會立刻終止。
#include
void (*signal(int sig, void (*func) (int) ))(int);
這個函式看起來很複雜,但使用卻是很簡單的。第乙個引數sig就是準備捕獲或遮蔽的訊號,接收到指定訊號時將呼叫func函式處理。。
ctrlc.c檔案
#include #include #include void ouch(int sig)
int main()}
這個程式就是截獲組合鍵ctrl+c產生的sigint訊號。沒有訊號出現時,它每隔一秒就會輸出乙個訊息。第一次按下ctrl+c產生的sigint訊號,
程式會呼叫ouch函式,輸出資訊,同時,恢復sigint為預設行為(即按下ctrl+c組合鍵後即結束執行),那麼第二次按下ctrl+c組合鍵時,程式就結束了執行。
執行效果見下圖:
kill函式的作用是把sig訊號傳送給標識為pid的程序,成功時返回「0」,失敗時返回「-1」. 要想傳送乙個訊號,兩個程序(傳送和接受兩方)必須擁有同樣的使用者id,,就是說,
你只能想自己的另乙個程序傳送訊號。但是超級使用者可以向任何程序傳送訊號。
#include
unsigned int alarm (unsigned int seconds ) ;
alarm函式是在seconds秒後安排傳送乙個sigalarm訊號。若seconds為0,表示將取消全部已經設定的鬧鐘請求。每乙個程序只有乙個可用的鬧鐘。
它的返回值是前乙個鬧鐘鬧響之前還需經過的剩餘秒數。呼叫失敗則返回「-1」.
#include #include #include static int alarm_fired = 0;程式通過fork啟動乙個新程序,這個紫禁城休眠5秒後向 自己的父程序傳送乙個sigalarm訊號。父程序在安排好捕捉sigalarm訊號後暫停執行,直到接收到乙個訊號為止。void ding(int sig)
int main()
/*父程序執行的內容*/
printf("5秒後鬧鈴啟動\n");
(void) signal(sigalrm, ding);
/*將執行的程式掛起,直到接收到訊號為止*/
pause();
if (alarm_fired)
printf("ding!\n");
printf("done\n");
exit(0);
}
執行結果見下圖:
Linux C程序與多執行緒入門 3 訊號
概念 訊號是系統響應某些狀況而產生的事件,程序在接受到訊號時會採取相應的行動。非常像微控制器的中斷 訊號可以明確地由乙個程序產生傳送到另外乙個程序,用這種辦法傳遞資訊或協調操作行為。程序可以生成訊號 捕捉並相應訊號或遮蔽訊號。訊號的名稱 是在標頭檔案 signal.h 裡定義。下面我列出一部分,如下...
Linux (C)多執行緒學習(入門)
下面兩個仁兄總結非常好。總結比較好 比較具體 例子 主要學習乙個例子 test1.c created on 2016年7月26日 author andy cong 利用多執行緒與有名管道技術,實現兩個程序之間傳送即時訊息,實現聊天功能。mkfifo xx 新建乙個管道xx 兩個程式test1 tes...
linux C 多執行緒
標頭檔案 include 執行緒建立 pthread create 執行緒退出 pthread exit 互斥鎖 pthread mutex init pthread mutex lock pthread mutex unlock void thread function void arg if 0...