1.核心理论
信号:在linux中信号是一个古老的进程间的通讯机制,就像古代烽火台所起到的传递信号的作用一样。
信号处理流程
信号通讯机制就分为三步:选择信号→发送信号→处理信号信号类型
linux系统支持的所有信号均定义在usr/include/asm/signal.h中,其中常见的信号有:
SIGKILL:杀死进程
SIGSTOP:暂停进程
SIGCHLD:子进程停止货结束时用来通知父进程。
2.函数学习:
发送信号函数:
函数名:kill
函数原型:int kill (pid_t pid, int sig)
头文件:sys/types.h signal.h
功能:发送信号给一个进程
返回值:成功返回0,失败返回-1或者errno
参数:pid:要发送信号的进程,sig:发送的信号。处理信号函数:
函数名:signal
函数原型:typedef void(*sighandler_t)(int)
sighandler_t signal(int signum , sighandler_t handler)
头文件:signal.h
功能:设置信号的处理方式
返回值:成功返回的是处理函数的指针,失败返回的值SIG_ERR
参数:signum:要处理的信号
handler:信号的处理方式
可设置的方式:
SIG_IGN忽视这个信号,
SIG_DEL:交给内核处理,
用户自定义的函数:交给用户处理函数处理
3.信号通信实例
实例中用到的函数
pause:等待进程发送函数。
atoi:将字符串转化成整型。发送进程
#include <sys/types.h>
#include <signal.h>
#include <stdio.h>
void main(int argc,char *argv[])
{
pid_t pid;
pid = atoi(argv[1]);
kill(pid,SIGINT);
}
注意:关于参数argc和argv[],前者是参数的个数,后者是要传递的参数名argc[0]是函数名,后面才是传递的参数。
- 处理进程
#include <unistd.h>
#include <signal.h>
void myfunc(int a)
{
printf("process B recieve SIGINT\n");
}
void main()
{
signal(SIGINT,myfunc);
pause();
}
程序的执行过程:
首先打开b(处理函数进程)进程:./bprocess
然后发送信号:kill -n SIGINT b进程的进程号
执行结果:打印出process B recieve SIGINT