signal()信号操作

Posted hellokitty2

tags:

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

一、函数描述

#include <signal.h>

typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);

signal()会将接收到的signum信号交给hander(可以是SIG_IGN, SIG_DFL)处理,signal()的功能会跟随着Unix版本的变化而变化。

当这个进程收到这个signum信号后,处理如下:

  ①如果handler是SIG_IGN,此信号被忽略

  ②如果handler是SIG_DFL,将由系统按默认的方法处理

  ③指定给handler函数来处理此信号。

返回值:signal()返回信号处理程序的前一个值,或者返回错误的SIG_ERR

注意:signal()在多线程进程中的影响是未指定的.

1.kill -l 列出所有信号;ctrl + c 产生SIGINT信号

2.#include <unistd.h>
int pause(void);

pause()会导致调用进程(或线程)进入休眠状态,直到收到信号,此时会终止进程或引起信号捕获函数的调用。

pause() 仅在信号被捕获并且信号捕获函数返回时才返回。 在这种情况下,pause()返回-1,errno被设置为EINTR。

3.select() poll() epoll() 都是基于信号的!

4.kill函数将信号发送给进程,raise函数允许进程向自身发送信号;
int kill(pid_t pid, int sig); //kill()系统调用可用于将任何信号发送到任何进程组或进程

5.int raise(int sig);
raise()向调用进程或线程发送信号(本线程/进程).在单线程进程中它等同于kill(getpid(), sig);
在多线程进程中它等同于pthread_kill(pthread_self(), sig);
如果信号导致处理程序被调用,那么raise()在信号处理程序返回后才会返回,成功返回0

6.用户自定义信号:SIGUSR1 和 SIGUSR2的使用:kill -USR1 processID 和 kill -USR2 processID

 

二、使用例子

用户信号的使用:
#include <stdio.h> #include <unistd.h> #include <signal.h> static void sig_usr_fun(int signo) { if (signo == SIGUSR1) { printf("received SIGUSR1!\n"); } else if (signo == SIGUSR2) { printf("receive SIGUSR2!\n"); } } int main() { if (signal(SIGUSR1, sig_usr_fun) == SIG_ERR) { printf("signal1 error!\n"); } if (signal(SIGUSR1, sig_usr_fun) == SIG_ERR) { printf("signal2 error!\n"); } for (;;) { pause(); } return 0; }

kill -SIGUSR1 15504
#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
int ext = 0;
static void sig_fun(int signo)  
{
    ext = 1;
    printf("Catch Signal SIGINT\n");
}

int main()
{
    char *p = NULL;
    int count = 0;
    p = malloc(100);
    signal(SIGINT, sig_fun);
    
    while(1){
        if(ext){
            break;
        }
        count++;
    }

    if(p != NULL){
        free(p);
     p = NULL; printf(
"p has been freed!\n"); } }

收到信号强制终止时释放资源,以免内存泄漏

 

以上是关于signal()信号操作的主要内容,如果未能解决你的问题,请参考以下文章

Linux信号详解:signal与sigaction函数

Linux信号详解:signal与sigaction函数

signal()信号操作

C语言signal()函数(通过设置一个函数(回调函数)来处理捕获到异常信号时需要执行的操作)

linux之信号处理函数signal和sigaction

Django signal 信号机制的使用