进程间的通信
目录
信号
什么是信号?信号是给程序提供一种可以处理异步事件的方法,它利用软中断实现。不能定义信号,所有信号都是由系统预定义的
信号由谁产生 ?
1.由shell终端根据当前发送的错误(段错误,非法指令等)而产生相应的信号
2.在shell终端,使用kill或killall命令产生信号
信号的处理
忽略此信号
捕捉此信号,指定信号函数进行处理
执行系统默认操作,大多数都是终止进程
信号的捕获
信号的捕获指:指定接收到某种信号后,去执行指定的函数
注:SIGKILL和SIGSTOP不能被捕获
也就是说信号的响应不能被改变
使用:
typedef void (*sighandler_t)(int)
signhandler_t signal(int signum,sighandler_t handler);
注:signal 返回类型和第二个参数都是函数指针类型,第一个参数表示信号类型
#include<stdio.h>
#include<stdlib.h>
#include<signal.h>
void myhandle(int sig)
{
printf("Catch a signal : %d\n",sig);
}
int main(){
signal(SIGINT,myhandle);
while(1){
sleep(1);
}
return 0;
}
输出:原本ctrl+c会中断程序运行,捕获后则按执行函数
信号的发送
使用kill函数
使用alarm函数,给自己发送SIGALRM信号,单位是秒每个进程最多使用一个闹钟
使用raise函数,给本进程发送信号,可指定信号类型
发送多个信号
某进程正在执行某个信号对应的操作函数期间,此时又收到多个同一个信号
if sig<32则只能再响应一次
else响应多次,但是,每次都必须等响应函数执行完后,再响应下一次
某进程... 收到另一个信号
if sig 被包含在当前信号的signaction的sa_mask(信号屏蔽集)中,则不会立即处理,直到3当前信号处理函数执行完后,才去执行该信号的处理函数
else: 立即中断当前函数,而去执行新的信号处理函数
信号集
信号集,用sigset_t表示,实质是一个无符号长整型,用来表示多个信号的集合
基本操作:
sigemptyset 清空信号集 sigfillset 把已定义的信号填充到指定信号集
sigdelset 从指定信号集删除信号 sigaddset从指定信号集添加指定的信号
sigismember 判断指定的信号是否在信号集中
进程的"信号屏蔽字"
进程的"信号屏蔽字"是一个信号集
修改进程的"信号屏蔽字":
int sigprocmask(int how,const sigset_t *set,sigset_t* oldset);
how: SIG_BLOCK//添加信号 SIG_UBLOCK//删除信号 SIG_SETMASK设为信号屏蔽字
oldset:返回原来的信号屏蔽字
获取未处理的信号:
通过sigpending函数获取已发生但未被处理的信号
阻塞式等待信号
标签:函数,int,指定,屏蔽,信号,linux,进程 From: https://blog.csdn.net/KKKK250/article/details/136972517pause: 阻塞线程,直到发生某一信号后
sigsuspend: 用指定的参数设置信号屏蔽字,然后阻塞时等待信号的发生