(1)發送信號傳參
前面已經知道從一個進程向另一個進程發送信號可以使用kill函數,但是kill函數在向進程發送信號的時候不能攜帶除了信號以外的其他信息,這時可以使用與kill相對應的sigqueue函數,該函數也是向一個進程發送信號,但是可以攜帶其它參數信息:
int sigqueue(pid_t pid, int sig, const union sigval value); 成功:0;失敗:-1,設置errno
union sigval {?????????? //向進程發送一個聯合體變量value
int?? sival_int;?
??? void *sival_ptr;
};
即sigqueue函數在向進程發送信號的同時,還可向進程發送一個變量value,包含兩個成員:一個是整型數據sival_int;另一個是泛型指針sival_ptr(通過該指針可以攜帶任何數據)。但是要注意一點:整型數據是按值傳遞,因此沒有問題;而發送的指針是該進程自己進程空間的虛擬地址,不同進程之間虛擬地址空間各自獨立,將當前進程地址傳遞給另一進程沒有實際意義。即進程給自己發送信號,傳送指針才會有意義。
(2)捕捉函數傳參
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);
?????????? };
當注冊信號捕捉函數,希望獲取更多信號相關信息,不應使用sa_handler而應該使用sa_sigaction。但此時的sa_flags必須指定為SA_SIGINFO。siginfo_t是一個成員十分豐富的結構體類型,可以攜帶各種與信號相關的數據。sa_flags為0,則捕捉函數使用sa_handler,且為默認屬性(在調用戶處理函數期間屏蔽信號本身);sa_flags為SA_SIGINFO,則捕捉函數使用sa_sigaction,該函數可以攜帶更多的參數:第一個參數同sa_handler函數,默認為信號編號,但自己也可以賦值;第二個參數為傳出參數,是一個結構體類型,其中包含了信號相關的數據;第三個參數為傳入參數,可以傳入一個泛型指針。