信号
信号是一种特别的IPC,大部分信号是异步的,也就是说,信号的到来是无法预料的。
信号总共有四种响应方式:
第一种:信号的默认响应动作(就是linux系统已经规定好的)
第二种:改变信号的响应动作
第三种:信号的忽略
第四种:信号的阻塞(信号的屏蔽)
以下为Linux的64种信号:
绝不部分信号默认动作都是终止程序,其中SIGSTOP / SIGKILL是无法被忽略和屏蔽的。
发送信号的两个常用命令:
kill -信号的序号 进程的ID
kill -信号的名字 进程的ID
kill -9 hello
kill -SIGKILL hello
kill -KILL hello
killall -信号的序号 进程的名字
killall -信号的名字 进程的名字
killall -9 hello
killall -SIGKILL hello
killall -KILL hello
3. 相关的接口函数
void catch_sig(int num)
{
printf("某个信号被捕捉到了!!!序号是:%d\n",num);
//kill(getpid(),SIGUSR1);//给某进程发送某信号
}
int main()
{
printf("本进程的ID号:%lu\n",getpid());
//捕捉SIGINT
signal(SIGINT,catch_sig);
signal(SIGKILL,catch_sig); //SIGKILL不能被改变响应动作
signal(SIGSTOP,catch_sig); //SIGKILL不能被改变响应动作
while(1); //防止主函数退出
}
int main()
{
printf("ID:%d\n", getpid());
sigset_t set;
sigemptyset(&set);//清空
sigaddset(&set,SIGINT);//添加信号到信号集
sigaddset(&set,SIGQUIT);//添加信号到信号集
//sigaddset(&set,SIGKILL);//此信号无法屏蔽
//sigaddset(&set,SIGSTOP);//此信号无法屏蔽
sigprocmask(SIG_BLOCK,&set,NULL);//屏蔽set里面的信号
while(1);
//sigpromask(SIG_UNBLOCK,&set,NULL);//接除阻塞
}