信号传参
(1)發(fā)送信號(hào)傳參
前面已經(jīng)知道從一個(gè)進(jìn)程向另一個(gè)進(jìn)程發(fā)送信號(hào)可以使用kill函數(shù),但是kill函數(shù)在向進(jìn)程發(fā)送信號(hào)的時(shí)候不能攜帶除了信號(hào)以外的其他信息,這時(shí)可以使用與kill相對(duì)應(yīng)的sigqueue函數(shù),該函數(shù)也是向一個(gè)進(jìn)程發(fā)送信號(hào),但是可以攜帶其它參數(shù)信息:
int sigqueue(pid_t pid, int sig, const union sigval value); 成功:0;失敗:-1,設(shè)置errno
union sigval {?????????? //向進(jìn)程發(fā)送一個(gè)聯(lián)合體變量value
int?? sival_int;?
??? void *sival_ptr;
};
即sigqueue函數(shù)在向進(jìn)程發(fā)送信號(hào)的同時(shí),還可向進(jìn)程發(fā)送一個(gè)變量value,包含兩個(gè)成員:一個(gè)是整型數(shù)據(jù)sival_int;另一個(gè)是泛型指針sival_ptr(通過該指針可以攜帶任何數(shù)據(jù))。但是要注意一點(diǎn):整型數(shù)據(jù)是按值傳遞,因此沒有問題;而發(fā)送的指針是該進(jìn)程自己進(jìn)程空間的虛擬地址,不同進(jìn)程之間虛擬地址空間各自獨(dú)立,將當(dāng)前進(jìn)程地址傳遞給另一進(jìn)程沒有實(shí)際意義。即進(jìn)程給自己發(fā)送信號(hào),傳送指針才會(huì)有意義。
(2)捕捉函數(shù)傳參
int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);
?????????? struct sigaction {
?????????????? void???? (*sa_handler)(int);
?????????????? void???? (*sa_sigaction)(int, siginfo_t *, void *);
?????????????? sigset_t?? sa_mask;
?????????????? int?????? sa_flags;
?????????????? void???? (*sa_restorer)(void);
?????????? };
當(dāng)注冊(cè)信號(hào)捕捉函數(shù),希望獲取更多信號(hào)相關(guān)信息,不應(yīng)使用sa_handler而應(yīng)該使用sa_sigaction。但此時(shí)的sa_flags必須指定為SA_SIGINFO。siginfo_t是一個(gè)成員十分豐富的結(jié)構(gòu)體類型,可以攜帶各種與信號(hào)相關(guān)的數(shù)據(jù)。sa_flags為0,則捕捉函數(shù)使用sa_handler,且為默認(rèn)屬性(在調(diào)用戶處理函數(shù)期間屏蔽信號(hào)本身);sa_flags為SA_SIGINFO,則捕捉函數(shù)使用sa_sigaction,該函數(shù)可以攜帶更多的參數(shù):第一個(gè)參數(shù)同sa_handler函數(shù),默認(rèn)為信號(hào)編號(hào),但自己也可以賦值;第二個(gè)參數(shù)為傳出參數(shù),是一個(gè)結(jié)構(gòu)體類型,其中包含了信號(hào)相關(guān)的數(shù)據(jù);第三個(gè)參數(shù)為傳入?yún)?shù),可以傳入一個(gè)泛型指針。
總結(jié)
- 上一篇: 成都欢乐谷夏季营业时间
- 下一篇: 终端的概念