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

2021-06-18 06:40:35 字數 2812 閱讀 7407

概念

訊號是系統響應某些狀況而產生的事件,程序在接受到訊號時會採取相應的行動。

(非常像微控制器的中斷),

訊號可以明確地由乙個程序產生傳送到另外乙個程序,用這種辦法傳遞資訊或協調操作行為。

程序可以生成訊號、捕捉並相應訊號或遮蔽訊號。

訊號的名稱

是在標頭檔案

signal.h

裡定義。下面我列出一部分,如下:

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

訊號名稱                            說明

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

sigalrm

警告鐘

sighup

系統結束通話

sigint

終端中斷

sigkill  

停止程序(此訊號不能被忽略或捕獲)

sigpipe

向沒有讀者的管道寫資料

sigquit

終端退出

sigterm 終止

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

如果程序接收到上表中的某個訊號但

實際並沒有安排捕捉它,程序就會立刻終止。

函式#include 

void   (*signal(int sig,  void (*func)  (int) ))(int);

這個函式看起來很複雜,但使用卻是很簡單的。第乙個引數

sig就是準備捕獲或遮蔽的訊號

(看上表

),接收到指定訊號時將呼叫

func

函式處理。 

例項1—處理sigint

(終端中斷)訊號

ctrlc.c檔案

#include 

#include 

#include 

void ouch(int sig)  

int main()   }

這個程式就是截獲組合鍵

ctrl+c

產生的sigint

訊號。沒有訊號出現時,它每隔一秒就會輸出乙個訊息。第一次按下

ctrl+c

產生的sigint

訊號,

程式會呼叫

ouch

函式,輸出資訊,同時,恢復

sigint

為預設行為(即按下

ctrl+c

組合鍵後即結束執行),那麼第二次按下

ctrl+c

組合鍵時,程式就結束了執行。

執行效果見下圖:

例項2—模仿鬧鐘行為

函式1#include 

#include 

int kill  (pid_t   pid,   int   sig);

kill

函式的作用是把

sig訊號傳送給標識為

pid的程序,

成功時返回

「0」,失敗時返回

「-1」. 

要想傳送乙個訊號,兩個程序(傳送和接受兩方)必須擁有同樣的使用者

id,,

就是說,

你只能向自己的另乙個程序傳送訊號。但是超級使用者可以向任何程序傳送訊號。

函式2#include 

unsigned int alarm (unsigned int seconds )  ;

alarm

函式是在

seconds

秒後安排傳送乙個

sigalarm

訊號。若

seconds為0

,表示將取消全部已經設定的鬧鐘請求。每乙個程序只有乙個可用的鬧鐘。

它的返回值是

前乙個鬧鐘鬧響之前還需經過的剩餘秒數。呼叫失敗則返回「-1」.

#include 

#include 

#include 

#include 

static int alarm_fired = 0;

void ding(int sig)

alarm_fired = 1;

int main()

int pid;

printf("鬧鐘已啟動。

\n");

/*子程序休眠

5秒後向父程序傳送

sigalarm

訊號,然後結束程序*/

if((pid = fork()) == 0)

sleep(5);

kill(getppid(), sigalrm);

exit(0);

/*父程序執行的內容*/

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裡定義。下面我列出一部分,如下 訊號名稱 說明 sigalrm ...

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