Linux中信号的使用

1、信号的基本概念

信号是系统响应某个条件而产生的事件,进程接收到信号会执行相应的操作。

2、修改信号的相应方式——signal()

利用signal()可以将指定的信号进行修改
忽略信号:SIG_IGN
默认处理:SIG_DFL
自定义的:自己写的信号处理函数

示例1:
例如下面这段程序表明将SIGINT(键盘按下ctrl+c时,产生该信号)信号修改为自定义的fun处理函数

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<assert.h>
void fun(int sign)
{
    
    
    printf("fun was called, sign = %d\n", sign);
}
int main()
{
    
    
    signal(SIGINT, fun);
    while(1)
    {
    
    
    sleep(1);
    printf("main running\n");
    }
    exit(0);
}

程序运行如下:
在这里插入图片描述

3、发送信号—— kill()

kill() 可以向指定的进程发送指定的信号‘
int kill(pid_t pid,int sig);

pid > 0 指定将信号发送个那个进程

pid == 0 信号被发送到和当前进程在同一个进程组的进程

pid == -1 将信号发送给系统上有权限发送的所有的进程

pid < -1 将信号发送给进程组 id 等于 pid 绝对值,并且有权限发送的所有的进程。

sig 指定发送信号的类型。

示例2:
下面的代码表示:运行此程序并输入一个进程的pid,将该进程使用sig信号进行处理

#include <stdio.h>
#include <unistd.h>
#include <assert.h>
#include <signal.h>

int main(int argc, char* argv[])//pid, sig
{
    
    
    if ( argc != 3 )
    {
    
    
    printf("argc error\n");
    exit(0);
    }
    int pid = 0;
    int sig = 0;
    sscanf(argv[1],"%d",&pid); 
    sscanf(argv[2],"%d",&sig);
   if ( kill(pid,sig) == -1 )
    {
    
    
     perror("kill error");
     }
      exit(0);
}

程序运行如下:
查询示例1的进程id,然后运行实例2,使用SIGKILL(#define SIGKILL 9)信号杀死进程14851(示例1)
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/m0_54355780/article/details/122790259