1.進程A向進程B發送信號;
2.進程B收到進程A發送的信號後,打印出發送信號進程的pid,uid以及信號值。
源代碼:
#include <stdlib.h>
#include <sys/types.h>
#include <signal.h>
#include <unistd.h>
{
printf("我是發送方,我的uid爲:%d\n",getuid());
printf("我是發送方,我的pid爲:%d\n",getpid());
int a;
printf("請輸入要接收信號的進程pid——\n");
scanf("%d",&a);
union sigval tt;
tt.sival_int = 6;
if(sigqueue(a,SIGUSR1,tt)==-1)
{
printf("send error\n");
}
return 0;
}
receive.c
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
{
printf("%d\n",getpid());
printf("等待接收信號---\n");
struct sigaction act,oldact;
sigemptyset(&act.sa_mask);
act.sa_flags = SA_SIGINFO;
act.sa_sigaction = tt;
sigaction(SIGUSR1,&act,&oldact);
pause();
return 0;
}
{
printf("receive SIGUSR1\n");
printf("信號編號爲: %d\n",signo);
printf("sender pid = %d\n",info->si_pid);
printf("sender uid = %d\n",info->si_uid);
sigqueue函數和 sigaction函數參考:點擊打開鏈接
https://blog.csdn.net/qq_37192076/article/details/80410113
補充:
siginfo_t {
int si_signo; /* 信號值*/
int si_errno; /* errno值,錯誤代碼*/
int si_code; /* 信號產生的原因*/
pid_t si_pid; /* 發送信號的進程ID,對實時信號有 意義 */
uid_t si_uid; /* 發送信號進程的真實用戶ID*/
int si_status; /* 退出狀態*/
clock_t si_utime; /* 用戶消耗的時間*/
clock_t si_stime; /* 內核消耗的時間*/
sigval_t si_value;
int si_int; //直接與sigval.sival_int關聯
void* si_ptr; //直接與sigval.sival_ptr關聯
void * si_addr; /* 觸發fault的內存地址*/
int si_band;
int si_fd;
}
聯合數據結構,說明siginfo_t結構中的si_value要麼持有一個4字節的整數值,要麼持有一個指針,這就構成了與信號相關的數據。在信號 的處理函數中,包含這樣的信號相關數據指針,但沒有規定具體如何對這些數據進行操作,操作方法應該由程序開發人員根據具體任務事先約定。