什么是信号:
对于Linux来说,信号是一种软中断机制。
信号为Linux提供了处理另一个事件发生的能力,例如我们运行一个循环进程时,往往会通过ctrl+c的方式来终止此程序,或者用KiLL直接杀死。这就是进程接收到了信号
信号类型有六十多种,我们可以通过kill -l来查看所有信号
对信号的处理有三种方式: 分别是:忽略、捕捉和默认动作 忽略:大多数信号都能被这样处理,但是有两种信号不能被忽略(分别是
SIGKILL和SIGSTOP)。 捕捉:这种方式用户往往可以自定义一个函数,当接收到特定信号时,可以执行函数内容
默认:系统设置好的信号,若产生该信号,系统将自动执行相应内容
信号发送函数KILL
可以直接在中断使用,输入KILL -9 PID(进程对应PID号,可用top指令或者ps -aux|grep 文件名 来查找),可以直接杀死进程
int main()
{
while(1);
}
我们运行上面函数,进程会一直运行。我们输入上面指令: kill -9 86879
显示进程已杀死
注册和处理函数
#include <signal.h>
typedef void (*sighandler_t)(int);//为函数指针,sighandler_t是函数类型
sighandler_t signal(int signum, sighandler_t handler);//signum为信号类型,handler是我们自定义所需要的函数
#include <signal.h>
#include <stdio.h>
//typedef void (*sighandler_t)(int);
//sighandler_t signal(int signum, sighandler_t handler);
void handler(int signum)
{
printf("%d",signum);
printf("signal has been ignored!\n");
}//中断函数
int main()
{
signal(SIGINT,handler);
while(1);
}
我们现在用上面代码忽略一下ctrl+c
信号,也是SIGINT
信号
ctrl+c的信号被忽略了
信号发送
方式一:
kill函数原型
int kill(pid_t pid, int sig);
#include <stdio.h>
#include <sys/types.h>
#include <signal.h>
#include <stdlib.h>
int main(int argc,char **argv)
{
int signum;
int pid;
signum = atoi(argv[2]);//第二个参数为信号类型
pid = atoi(argv[1]);//第一个参数为pid号码
//因为pid和signum都是整数形,我们输入的参数为字符数组,所以需要我们转为数字
kill(pid,signum);
while(1);
}
我们继续运行test代码
int main()
{
while(1);
}
输入 ./14(kill发送程序) pid test进程码
效果如下:
已经杀死进程
方式二
#include <stdio.h>
#include <sys/types.h>
#include <signal.h>
#include <stdlib.h>
int main(int argc,char **argv)
{
int signum;
int pid;
char *cmd;//开辟一个字符串
cmd = malloc(sizeof(char)*128);//开辟大小
printf("please input process pid\n");
scanf("%d",&pid);//输入进程pid号
printf("please input signum!\n");
scanf("%d",&signum);//输入信号类型
sprintf(cmd,"kill -%d %d",signum,pid);//将信息写入cmd
system(cmd);//可以查看之前文章,运行cmd内容
// while(1);
free(cmd);//释放空间
printf("success!\n");
}
效果如下:
我们查到进程号并输入9杀死test进程!