linux_信号-终端按键信号-硬件异常信号-kill函数-raise函数-abort函数
接上一篇:linux_信号概念、事件、状态、常见信号解释、信号屏蔽字、未决信号集
本次来继续分享信号的相关知识点,主要是一些常产生的信号介绍,以及怎么通过代码来发送信号杀死进程,主要是kill函数、raise函数、abort函数的调用,话不多说,开始上菜:
此博主在CSDN发布的文章目录:【我的CSDN目录,作为博主在CSDN上发布的文章类型导读】
目录
- 1.终端按键产生信号
- 2.硬件异常产生信号
- 3.kill函数-kill命令产生信号
- 3.1.kill命令
- 3.1.1.参数
- 3.1.2.杀死进程
- 3.2.kill函数
- 4.raise函数
- 5.abort函数
1.终端按键产生信号
Ctrl + c → 2) SIGINT(终止/中断)
Ctrl + z → 20) SIGTSTP(暂停/停止)
Ctrl + \ → 3) SIGQUIT(退出)
2.硬件异常产生信号
除0操作 → 8) SIGFPE (浮点数例外) "F" -----float 浮点数。
非法访问内存 → 11) SIGSEGV (段错误)
总线错误 → 7) SIGBUS
3.kill函数-kill命令产生信号
3.1.kill命令
kill:用来终止指定的进程(terminate a process)的运行
3.1.1.参数
kill -l
#查看信号编号
3.1.2.杀死进程
kill -SIGKILL 【PID-进程ID号】
#向当前进程发送了9号信号(SIGKILL),杀死当前进程
也可以写成:kill -9【PID-进程ID号】
查看进程ID命令:ps aux
例如:
kill -SIGKILL 89899 #杀死89899进程
3.2.kill函数
函数作用:
给指定进程发送指定信号(不一定杀死)
头文件:
#include <signal.h>
函数原型:
int kill(pid_t pid, int sig);
函数参数:
sig:不推荐直接使用数字,应使用宏名,因为不同操作系统信号编号可能不同,但名称一致。
pid > 0: 发送信号给指定的进程。
pid = 0: 发送信号给 与调用kill函数进程属于同一进程组的所有进程。
pid < 0: 取|pid|发给对应进程组。
pid = -1:发送给进程有权限发送的系统中所有进程。
返回值:
成功:0;
失败:-1 (ID非法,信号非法,普通用户杀init进程等权级问题),设置errno
进程组: 每个进程都属于一个进程组,进程组是一个或多个进程集合,他们相互关联,共同完成一个实体任务,每个进程组都有一个进程组长,默认进程组ID与进程组长ID相同。
权限保护: super用户(root)可以发送信号给任意用户,普通用户是不能向系统用户发送信号的。 kill -9 (root用户的pid) 是不可以的。同样,普通用户也不能向其他普通用户发送信号,终止其进程。 只能向自己创建的进程发送信号。普通用户基本规则是:发送者实际或有效用户ID == 接收者实际或有效用户ID
例子:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>
int main(void)
{
pid_t pid;
pid = fork();//创建子进程
if (pid == -1 )
{
perror("fork");
exit(1);
}
else if (pid == 0)
{
sleep(1);
printf("我是子进程 %d, ppid = %d\n", getpid(), getppid());
kill(getppid(), SIGKILL);//子进程杀死了父进程
}
else
{
sleep(2);
printf("我是父进程 %d\n", getpid());
while(1);
}
return 0;
}
4.raise函数
函数作用:
给当前进程发送指定信号(即自己给自己发)。
头文件:
#include <signal.h>
函数原型:
int raise(int sig);
函数参数:
sig:需要发送的信号
返回值:
成功:0;
失败:非0值;
例子:
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
int main(void)
{
printf("开始调用raise函数!!!\n");
raise(SIGSEGV);//核心段错误
printf("结束调用raise函数!!!\n");
return 0;
}
5.abort函数
函数作用:
给自己发送异常终止信号,6) SIGABRT 信号,终止并产生core文件
头文件:
#include <stdlib.h>
函数原型:
void abort(void);
函数参数:
无
返回值:
无
例子:
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
int main(void)
{
printf("开始调用abort函数!!!\n");
abort();
printf("结束调用abort函数!!!\n");
return 0;
}
以上就是本次的分享了,希望能对大家有所帮助。