进程间通信(IPC)——信号

关于信号的常用命令:
kill -l:查看系统中所有的信号

初级:

kill(传送信号给指定进程)

需要的头文件:
#include <sys/types.h>
#include <signal.h>
参数原型:int kill(pid_t pid, int sig);
pid:要发送消息的进程号
sig:信号
例如:
kill (pid,signum);

返回值:成功返回0
失败返回-1

signal(设置信号处理方式)

需要的头文件:
#include <signal.h>
参数原型:typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
signum:信号代码(可以指定SIGKILL和SIGSTIOP以外的所有信号
handler:自定义的信号处理函数指针
SIG_IGN:忽略该信号
SIG_DFL:采用信号默认方式处理信号
例如:void handler(int signum)
{ printf(“get signum = %d\n”,signum);
switch(signum){
case 2:
printf(“SIGINT\n”);
break;
case 9:
printf(“SIGKILL\n”);
break;
case 10:
printf(“SIGUSR1\n”);
break;
}
printf(“never quit\n”);
}
signal(SIGINT,handler);

相关代码:

接收信号端:
在这里插入图片描述
发送信号端:在这里插入图片描述

高级:

sigaction(查询或设置信号处理方式)

需要的头文件:
#include <signal.h>
参数原型:int sigaction(int signum, const struct sigaction *act,struct sigaction *oldact);
signum:信号代码,可以指定除了SIGKILL和SIGSTOP以外的所以信号
act:指向结构sigaction的一个实例的指针,指定对特定信号的处理
struct sigaction
{
void(*sa_handler)(int signo);
void (*sa_sigaction)(int, siginfo_t *, void *);
sigset_t sa_mask;
int sa_flags;
void (*sa_restore) (void);
};
sa_handler(代表新的信号处理方式):是一个函数指针,指定信号处理函数,这里除可以是用户自定义的处理函数外,还可以为SIG_DFL(采用默认的处理方式)或SIG_IGN(忽略信号)。它的处理函数只有一个参数,即信号值。
sa_mask是一个信号集,他可以指定在信号处理程序执行过程中哪些信号应当被屏蔽,在调用信号捕获函数之前,该信号集要加入到自己信号的信号屏蔽字中
sa_flag是一个选项,主要理解两个:
SA_INTERRUPT 由此信号中断的系统调用不会自动重启
SA_RESTART 由此信号中断的系统调用会自动重启
SA_SIGINFO 提供附加信息,一个指向siginfo结构的指针以及一个指向进程上下文标识符的指针
最后一个参数是一个替代的信号处理程序,当设置SA_SIGINFO时才会用他。
例如: struct sigaction act;
act.sa_sigaction = handler;
act.sa_flags = SA_SIGINFO;
sigaction(SIGUSR1,&act,NULL);

接收端:

在这里插入图片描述

sigqueue(信号发送函数):

需要的头文件:
#include <signal.h>
参数原型:int sigqueue(pid_t pid, int sig, const union sigval value);
pid:发送端的进程pid。
sig:参数确定即将发送的信号
value:信号附加信息,为一个union sigval联合体,包括一个sival_int整型和一个sival_ptr指针
*union sigval {
int sival_int;
void sival_ptr;
};

例如: union sigval value;
value.sival_int = 100;
sigqueue(pid,signum,value);

发送端:

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值