//**********==訊號
**********==
訊號是程序間唯一的非同步通訊
1:由硬體檢測產生(
sigsegv
:段錯誤)
2:由終端按鍵產生(
sigint
:ctrl+c)
3:由軟體本身產生(
sigpipe
:管道)
4:由核心傳送(
sigio
、sigurg)
5:由其他程序傳送(
kill)
收到乙個訊號該怎麼處理:
1:忽略該訊號
2:按照預設方式處理
3:由使用者自定義處理(
signal)(
捕捉)常用的訊號
#define sighup 1 //父程序給子程序發的
#define sigchld 17 //子程序給父程序傳送的
sigint //ctrl + c
sigquit //ctrl + \
sigabrt //當呼叫
abort()
函式的時候,讓程序非正常結束;
sigfpe //當發生算數異常的時候給當前程序傳送該訊號
sigkill //可以直接殺死某個程序(系統程序)
sigsegv //發生段錯誤時會向當前程序傳送該訊號
sigpipe //在管道中,當管道的讀端關閉,寫端寫入資料則會收到
sigpipe訊號
sigalrm //當鬧鐘定時結束,程序收到該訊號
sigstop //傳送該訊號,程序暫停,
gdb除錯中的打斷點
sigcont //gdb除錯中跳過斷點
sigio //由核心傳送給應用程序
sigurg //在網路程式設計中,當網絡卡收到緊急資料
(帶外資料
)時,會收到該訊號
//這兩個沒有特殊的意義,具體該做什麼由程式設計師來決定
sigusr1
sigusr2
void (*signal(int signum, void (*handler)(int)))(int);
void func(int arg)
void (*p)(int);
p = signal(sigusr1, func); //這個函式執行時,只是告訴核心,以後
//如果收到
sigusr1
訊號,則去執行
func函式
//p表示上一次
sigusr1
的訊號處理函式
sigkill和
sigstop
不能使用
signal
進行註冊
pause: 可以阻塞當前程序,直到受到任意乙個訊號為止,可以用來實現多個程序之間的同步
,注意使用訊號實現程序間的同步有一定
的缺陷,因為pause在收到任何訊號,都會繼續,有時候會接受意外的訊號,達不到預期的要求。
sleep:可以讓程序睡眠,在睡眠過程中,只要收到訊號就會醒來。
子程序會繼承父程序對訊號的處理方式。
當使用終端按鍵給程式發訊號時,產生的訊號會發給程式中所有的程序.
程序間通訊(IPC) 訊號
關於訊號的常用命令 kill l 檢視系統中所有的訊號 需要的標頭檔案 include include 引數原型 int kill pid t pid,int sig pid 要傳送訊息的程序號 sig 訊號 例如 kill pid,signum 返回值 成功返回0 失敗返回 1 需要的標頭檔案 i...
程序間通訊IPC 訊號量
訊號量 訊號量 主要來實現程序間或執行緒間的同步 也可以實現互斥 訊號量的值 表示資源的可用量。訊號量操作流程 1 建立乙個訊號量集合 param 2 訊號量集合中訊號量的個數 int semid int semget key t key,int nsems,int sem semid semget...
IPC程序間通訊(訊號量)
訊號量是乙個計數器,用於為多個程序提供對共享資料物件的訪問。訊號量和p v原語操作是由dijkstra 迪傑斯特拉 所提出的。執行p操作時,將該程序狀態設定為等待狀態,並把 該程序的pcb插入相應的等待佇列s.queue末尾 執行v操作時,喚醒相應等待佇列s.queue中等待的乙個程序 改變其狀態為...