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字节的整数值,要么持有一个指针,这就构成了与信号相关的数据。在信号 的处理函数中,包含这样的信号相关数据指针,但没有规定具体如何对这些数据进行操作,操作方法应该由程序开发人员根据具体任务事先约定。


猜你喜欢

转载自blog.csdn.net/qq_37192076/article/details/80456265