關於linux中signal函式宣告的解讀

2021-09-30 19:45:13 字數 831 閱讀 4004

在linux系統中,有乙個signal函式,用來傳送訊號,但這個函式的宣告有點複雜,signal原型為:

void (*signal(int sig, void (*func)(int)))(int);
乍一看,這個函式的原型實在是太複雜了,解讀變數或函式的宣告首先遵守下面的原則:

a. 宣告從它的名字開始讀取,然後按照優先順序順序依次讀取。名字是什麼呢,從左到右碰到的第乙個識別符號就是名字.

b.優先順序從高到低依次是:

c 如果const和volatile關鍵字的後面緊跟型別說明符(如 int,long等),那麼它作用於型別說明符.在其他情況下,const和volatile關鍵字作用於它左邊緊鄰的星號.

根據上面的規則,讓我們解讀signal函式的原型:

首先根據規則a,從左到右讀到的第乙個識別符號signal,說明宣告的東西是signal,然後根據規則b的優先順序,字尾操作符優先於字首操作符,因此讀到signal( ),signal後面是乙個(),說明signal是乙個函式,函式引數先不看,函式除了引數剩下的就是返回值,剩下部分:

void (*    )(int);
上面是signal函式的返回值,等價於下面p的含義:

void (*p)(int);
再按照上面的規則讀取,p是乙個指標,指向乙個函式,這個函式帶乙個int形參,返回值為void.

這樣,合起來就是:

signal是乙個函式,形參有兩個,乙個為int,另乙個為指向帶乙個int形參,返回值為void的函式的指標;返回值為指向帶乙個int形參,返回值為void的函式的指標;形參為乙個int.

linux 中signal機制如何應用 二

上一節linux 中signal機制如何應用 一 講的例子是不帶引數的訊號處理機制,這一節講帶引數的。我們知道用kill只是傳送訊號不能攜帶引數,如果我們想要傳送訊號給程序並且攜帶引數,那就得用sigqueue函式了。可以說,sigqueue函式比kill更加強大,經常是與sigaction 函式配...

linux 訊號 signal函式

include include include include include include include signal 函式有iso c定義,因為iso c 不涉及多執行緒 程序組以及終端i o等,所以它對訊號的定義非常含糊,以至於對於unix系統而言毫無作用。最好用sigactioan來代替...

linux中的訊號處理(signal與alarm)

簡單處理程式 函式介紹 alarm 設定訊號傳送鬧鐘 相關函式 signal,sleep 表頭檔案 include 定義函式 unsigned int alarm unsigned int seconds 函式說明 alarm 用來設定訊號sigalrm在經過引數seconds指定的秒數後傳送給目前...