總結 程序訊號

2021-08-20 08:46:39 字數 2259 閱讀 4609

作業系統內部的互動機制。

1.通過終端按鍵產生訊號

ctrl+c、ctrl+\

sigint的預設處理動作是終止程序,sigquit的預設處理動作是終止程序並且core dump

core dump叫做核心轉儲,當乙個程序要異常終止時(通常是有bug),可以選擇把程序的使用者空間記憶體資料全部儲存到磁碟上。檔名叫做core。線上的伺服器是不允許產生core檔案的。

2.呼叫系統函式向程序發訊號

使用kill命令,kill命令是呼叫kill函式實現的。kill函式可以給乙個指定的程序傳送指定的訊號。raise函式可以給當前程序傳送指定訊號(自己給自己傳送訊號)。

3.由軟體條件產生訊號

管道讀端關閉產生sigpipe,也是一種軟體條件產生的訊號。

4.硬體異常產生

cpu:零作為除數,會產生sigfpe訊號。

mmu:訪問記憶體發現乙個記憶體非法或記憶體越界,mmu裝置會發現錯誤並通知作業系統核心發乙個11號訊號,就會產生段錯誤。

訊號遞達:實際執行訊號的處理動作

訊號未決:訊號從產生到遞達之間的狀態。

程序可以選擇阻塞某個訊號。

阻塞和忽略的區別:

只要訊號被阻塞就不會遞達,忽略是在遞達之後可選的一種處理動作。

訊號在核心中表示

每個訊號都有兩個標誌位分別表示阻塞和未決,還有乙個函式指標表示處理動作。

sigset_t:訊號集,非零即一。阻塞訊號集也叫做當前程序的訊號遮蔽字。

pause:呼叫程序掛起直到有訊號遞達

#include int pause(void);

sigprocmask

讀取或更改程序的訊號遮蔽字

#includeint sigprocmask(int how,const sigset_t *set,sigset_t *oset);

//返回值:若成功為0,出錯為-1

pending

讀取當前程序的未決訊號,只能讀不能改。

#includesigpending(sigset_t *set);
經典訊號處理

sigalarm時鐘訊號

#include unsigned int alarm(unsigned int seconds);//時間以秒為單位

**實現捕捉訊號,讀取訊號遮蔽字。

#include#include#includevoid myhander(int sig)                     

void printsigset(sigset_t* set)else

}

printf("\n");

}

int main()

sigset_t pending_set;

sigpending(&pending_set);

printsigset(&pending_set);

sleep(1);

}

return 0;

}

可重入函式

同乙個函式在多個執行流中同時呼叫,沒有邏輯問題。如果乙個函式訪問自己的區域性變數或引數,叫做可重入函式。

不可重入函式

同乙個函式在多個執行流中同時呼叫,有邏輯問題。如果函式訪問乙個全域性鍊錶,則可能會因為重入而發生錯亂。

volatile限定符

關鍵字,防止編譯器對**過度的優化

競態條件

執行時序並不像我們寫程式所設想的那樣,由於非同步事件在任何時候都有可能發生(非同步事件有時候指出現更高優先順序的程序),由於時序問題導致錯誤,叫做競態條件。

sigchld

為避免產生殭屍程序

**實現:

void handler(int sig_id)

printf("child exit!\n");

} int main()else if(id>0)

}else

return 0;

}

Linux程序訊號筆記總結

訊號 作用 為了通知我們某個事件的發生 就是乙個軟中斷,通知程序發生某件事情,打斷程序當前的操作,去先處理這個事件 必須認識訊號,訊號不是立即處理的。而實現記錄下來,選擇乙個合適的事機處理 訊號必須有預設的處理方式,當然也可以改變。訊號是可以被阻塞,暫時不處理 訊號的週期性 生命週期 產生 註冊 登...

Linux 程序通訊之 訊號和訊號量總結

如今最經常使用的程序間通訊的方式有 訊號,訊號量,訊息佇列,共享記憶體。所謂程序通訊,就是不同程序之間進行一些 接觸 這種接觸有簡單,也有複雜。機制不同,複雜度也不一樣。通訊是乙個廣義上的意義,不僅僅指傳遞一些massege。他們的用法是基本相同的,所以僅僅要掌握了一種的用法,然後記住其他的用法就能...

linux 程序通訊 訊號學習總結(1)

liux 下程序通訊有訊號 管道和system v 的ipc的三種通訊方式 訊號量 訊息佇列以及共享記憶體。訊號在linux通訊方式中是一種最簡單的通訊方式,它只傳送簡單的資料,實際上是一種非同步軟中斷的通訊方式。linux的訊號有很多,其中最常用的有sigkill sigalrm sigstop ...