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