Linux C程序與多執行緒入門 3 訊號

2021-06-12 12:13:56 字數 2144 閱讀 9950

訊號是系統響應某些狀況而產生的事件,程序在接受到訊號時會採取相應的行動。訊號可以明確地由乙個程序產生傳送到另外乙個程序,用這種辦法傳遞資訊或協調操作行為。

程序可以生成訊號、捕捉並相應訊號或遮蔽訊號。訊號的名稱是在標頭檔案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;

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

}

程式通過fork啟動乙個新程序,這個紫禁城休眠5秒後向 自己的父程序傳送乙個sigalarm訊號。父程序在安排好捕捉sigalarm訊號後暫停執行,直到接收到乙個訊號為止。

執行結果見下圖:

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...