程序間通訊之訊號講解

2021-10-22 07:22:54 字數 2884 閱讀 3908

程序間通訊的另外一種方式-----訊號

三、相關的介面函式

總結kill -l 檢視linux系統中定義的所有訊號,程式設計師是不可以自定義訊號

1)kill -訊號的序號 程序的id

例如 kill -9 20000

kill -kill 20000

kill -sigint 20000

2)killall -訊號的序號 程序的名字

ctrl + c預設給當前程序傳送了sigint訊號

linux規定的訊號絕大部分預設動作都是終止程序,具體如下:

1

) sighup 2

) sigint 3

) sigquit 4

) sigill 5

) sigtrap

6) sigabrt 7

) sigbus 8

) sigfpe 9

) sigkill 10

) sigusr1

11) sigse** 12

) sigusr2 13

) sigpipe 14

) sigalrm 15

) sigterm

16) sigstkflt 17

) sigchld 18

) sigcont 19

) sigstop 20

) sigtstp

21) sigttin 22

) sigttou 23

) sigurg 24

) sigxcpu 25

) sigxfsz

26) si**talrm 27

) sigprof 28

) sigwinch 29

) sigio 30

) sigpwr

31) sigsys 34

) sigrtmin 35

) sigrtmin+136

) sigrtmin+237

) sigrtmin+338

) sigrtmin+439

) sigrtmin+540

) sigrtmin+641

) sigrtmin+742

) sigrtmin+843

) sigrtmin+944

) sigrtmin+

1045

) sigrtmin+

1146

) sigrtmin+

1247

) sigrtmin+

1348

) sigrtmin+

1449

) sigrtmin+

1550

) sigrtmax-

1451

) sigrtmax-

1352

) sigrtmax-

1253

) sigrtmax-

1154

) sigrtmax-

1055

) sigrtmax-956

) sigrtmax-857

) sigrtmax-758

) sigrtmax-659

) sigrtmax-560

) sigrtmax-461

) sigrtmax-362

) sigrtmax-263

) sigrtmax-164

) sigrtmax 總共62個訊號

1) 標頭檔案 signal.h

2) int kill(pid_t pid,int sig)

引數:pid --> 你要傳送訊號的那個程序id

sig --> 你要傳送的那個訊號的序號

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

void (函式名(引數1,引數2)(int);

返回值 :函式指標 void()(int)

引數 :sig -->你要捕捉的訊號的序號或者名字

void(*func)(int) -->你捕捉到訊號以後,需要改變的動作就通過這個函式實現

2)注意 : 第一點:有兩個訊號是不能改變他們的預設動作也不能忽略,sigkill和sigstop

第二點:signal函式總共有三種用法

用法一:改變訊號的預設動作signal(某個訊號,函式);

用法二:忽略訊號signal(某個訊號,sig_ign);忽略訊號,訊號傳送過來以後直接捨棄,左耳進右耳出,當做不存在

用法三:使用訊號的預設動作 signal(某個訊號,sig_dfl);

**如下(示例):

//自定義乙個函式實現捕捉到sigint訊號以後的動作 

void

catchint

(int sig)

intmain()

}

一、訊號的傳送(是kill的公升級版,傳送訊號的時候可以攜帶額外資料)

int sigqueue(pid_t pid,int sig,const union si**al value);

引數 :value -->傳送訊號需要攜帶的額外資料就儲存在這個聯合體

union si**al

/*

sigqueue傳送訊號攜帶額外資料

*/int

main

(int argc,

char

**ar**)

/*

void catchint(int sig,siginfo_t *info, void *arg)

*/void

catchint

(int sig)

intmain()

程序間通訊之訊號

訊號是軟體中斷。很多比較重要的應用程式都需要處理訊號。訊號提供了一種處理非同步事件的方法。每個訊號都有乙個名字,並且他們的名字都是以sig開頭的。訊號的處理或相關動作有三種處理方式 1 預設訊號 sig dfl 2 忽略訊號 sig ign 大多數訊號可採用,除sigkill和sigstop外。3 ...

程序間通訊之管道講解

三 有名管道相關操作 總結通訊要解決的實際問題,就是多個程序之間如何實現資料的收發 分為兩種 有名管道,無名管道 屬於半雙工 全雙工 通訊雙方在任何時刻都能互相收發資訊,收發資訊可以同時進行不受任何影響 半雙工 通訊雙方在任意時刻都只能是一方發生,一方接收,不能同時兩邊都收發 父子程序採用無名管道通...

linux程序間通訊之訊號

1 wait 函式 原型 pid t wait int status 子程序退出時,它向父程序傳送乙個sigchld訊號,預設情況是總是忽略sigchld訊號,此時程序狀態一直保留在記憶體中,因此需要父程序去處理改訊號,處理的辦法則是呼叫wait 函式,收集子程序狀態資訊,並清空該資訊 使用wait...