Linuxc 信號的使用4

1.進程A向進程B發送信號;
2.進程B收到進程A發送的信號後,打印出發送信號進程的pid,uid以及信號值。


源代碼:

send.c
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <signal.h>
#include <unistd.h>
int main()
{
 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 <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
void tt(int signo,siginfo_t *info,void *p);
int main()
{
 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;
}
void tt(int signo,siginfo_t *info,void *p)
{
 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字節的整數值,要麼持有一個指針,這就構成了與信號相關的數據。在信號 的處理函數中,包含這樣的信號相關數據指針,但沒有規定具體如何對這些數據進行操作,操作方法應該由程序開發人員根據具體任務事先約定。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章