Linux 发送信号

Posted 庖丁解牛

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux 发送信号相关的知识,希望对你有一定的参考价值。

使用kill命令
--在命令行执行kill命令。向指定进程发送信号。

 

使用kill函数
int kill(pid_t pid,int sig);
--参数pid指定一个要杀死的进程,而sig是要发送的信号。
//kill函数发送信号
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>

#include <sys/types.h>
#include <signal.h>

int main(int arg, char *args[])
{
    if(arg<2)
    {
        printf("请输入一个参数!\n");
        return -1;
    }
    pid_t pid=atoi(args[1]);
    int resint=0;
    resint=kill(pid,SIGKILL);
    printf("返回值是%d\n",resint);//打印0
    return 0;
}

 

使用raise函数
int raise(int signum);
kill函数将信号发送给进程,raise函数允许进程向自身发送信号
raise(signum)相当于kill(getpid(),signum);

 

alarm函数设置了一个定时器,当定时器到了给当前进程发送SIGALRM信号。
unsigned int alarm(unsigned int seconds);
seconds是计时器时间到后时钟的秒数。
如果没有设置其他超时,函数返回0,否则返回值为前面安排超时中保留的秒数。
一个进程只能设置一次超时
把seconds设置为0可以取消前面的超时设置。
//捕捉信号
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <signal.h>

void catch_signal(int sign)
{
    switch(sign)
    {
    case SIGINT:
        //SIGINT默认行为是退出进程
        printf("SIGINT signal\n");
        exit(0);
        break;
    case SIGALRM:
        //SIGALRM默认行为是退出进程
        printf("SIGALRM signal\n");
        alarm(5);
        break;
    case SIGKILL:
        printf("SIGKILL signal\n");
        break;
    }
}

int main(int arg, char *args[])
{
    signal(SIGINT,catch_signal);
    signal(SIGALRM,catch_signal);
    signal(SIGKILL,catch_signal);
    int i=0;
    //永远循环的alarm信号
    alarm(5);
    while(1)
    {
        printf("hello god  %d\n",i++);
        sleep(1);
    }
    return 0;
}

 

abort函数
void abort(void);
该函数发送SIGABRT信号给调用进程,进程不应该忽略这个信号。
即使进程捕捉到SIGABRT这个信号,进程还是会异常退出
让进程捕捉SIGABRT的意图是在进程终止前由其执行所需的清理操作。

 

以上是关于Linux 发送信号的主要内容,如果未能解决你的问题,请参考以下文章

向自己发送终止信号

linux——信号详解和实操代码

linux——信号详解和实操代码

[TimLinux] Django 信号

Linux驱动实践:中断处理函数如何发送信号给应用层?

Linux驱动实践:中断处理函数如何发送信号给应用层?