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
函数原型:
  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 
#include 
#include 
#include 
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
函数原型:
  int raise(int sig);
函数参数:
  sig:需要发送的信号
返回值:
  成功:0;
  失败:非0值;

例子:

#include 
#include 
#include 
int main(void)
{
    printf("开始调用raise函数!!!\n");
    raise(SIGSEGV);//核心段错误
    printf("结束调用raise函数!!!\n");
    return 0;
}

5.abort函数

函数作用:
  给自己发送异常终止信号,6) SIGABRT 信号,终止并产生core文件
头文件:
  #include
函数原型:
  void abort(void);
函数参数:
  无
返回值:
  无

例子:

#include 
#include 
#include 
int main(void)
{
    printf("开始调用abort函数!!!\n");
	abort();
	printf("结束调用abort函数!!!\n");
    return 0;
}

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

你可能感兴趣的:(Linux笔记,linux,运维,服务器,c语言,ubuntu)