当前位置: 首页 > article >正文

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;
}

以上就是本次的分享了,希望能对大家有所帮助。


http://www.kler.cn/a/13466.html

相关文章:

  • 怎么将太大的word文档压缩变小,3个高效方法
  • 认识软件测试
  • iOS Matter 操作证书签发方案
  • go 语言中 struct 中 json 是代表什么意思
  • IPWorks VoIP 2022 Crack
  • 在OLED上显示各种各样的数据(文字、字母、图片)
  • PWM控制直流电机
  • 【FPGA实验1】FPGA点灯工程师养成记
  • 什么是BASE最终一致性
  • 高压放大器应用之无损检测
  • ASRock Z690 Extreme WiFi 6E i7 13700KF电脑 Hackintosh 黑苹果efi引导文件
  • 用python获取当前目录下的创建时间超过3天的所有python文件
  • 靶机精讲:BNE0x03Simple
  • 月收入过万是什么水平?在90年代可是“万人户”
  • Docker容器部署
  • 微信为什么使用 SQLite 保存聊天记录
  • Java线程基础知识
  • Hive msck 描述
  • matlab数据归一化与反归一化处理
  • 信息安全复习四:置换密码乘积密码隐写术