• Linux 信号捕捉


    pause函数
    pause函数挂起调用它的进程,直到有任何消息到达。
    调用进程必须有能力处理送达的信号,否则信号的默认部署就会发生。
    int pause(void);
    只有进程捕获到一个信号的时候pause才返回,如果递送到的信号引发了对信号的处理,那么处理工作将在pause返回前执行。
    pause总是返回-1,并且将变量errno设置为EINTR。
    发送信号和捕获信号是相辅相成的。
    每个进程能够决定响应除了SIGSTOP和SIGKILL之外的其他所有信号。
    SIGSTOP和SIGKILL不能被捕获或者忽略。
    捕获信号不是真的去捕获它,而是等待信号被发送过来。
    当执行一个程序的时候,所有信号的状态都是系统默认或者忽略。
    当一个进程调用fork的时候,其子进程继承父进程的信号处理方式,所以信号捕捉函数的地址在子进程中是有意义的,
    定义信号处理器
    某些情况下,一个信号的默认动作就是所希望的行为。但更多场合下,你可以改变默认行为或者执行额外的代码。
    如果想改变默认行为就必须定义并安装一个自动的信号处理器。
    指向函数的指针
    --可以用指针变量指向整型变量、字符串、数组、结构体、也可以指向一个函数。
    --一个函数在编译时被分配一个入口地址,这个入口地址被称为函数指针。
    --可以用一个指针变量指向函数,然后通过该指针变量调用此函数。
    回调函数
    --回调函数就是一个通过函数指针调用的函数。
    --如果把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。
    --回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外一方调用,用于对该事件或条件进行响应。
    --windows编程下的窗口过程就是典型的回调函数。
    signal函数
    --UNIX/Linux处理信号最常用的接口是signal函数
      .在命令行使用kill命令,向指定进程发送信号。
    --使用kill函数
    typedef void (*sighandler_t)(int);
    sighandler_t signal(int signum, sighandler_t handler);
    signal函数一般用于捕捉信号,其功能是为一个信号注册一个回调函数。
    第一个参数signum一般就是系统提供的信号,表示要捕捉这个信号。
    第二个参数指定类型的函数指针(typedef void (*FUNC)(int)),该函数有个int型参数,int代表捕获到的信号值。
    捕捉多个信号需要使用多个signal()函数
    
    进程捕捉到信号并对信号进行处理时,进程正在执行的指令序列就被信号处理程序临时中断。它首先执行该信号处理程序中的指令。
    如果信号处理程序返回(没有调用exit(0)或者abort()),则继续执行在捕获到信号时进程正在执行的正常指令序列。
    在信号处理程序中,不能判断捕捉到信号是进程正在何处执行。
    
    编译后执行该程序
    用kill命令发送信号给该程序
    --kill命令作用其实不是‘杀死’的意思,而是将指定信号发送给指定进程。
    --kill [-s signal|-p] [--] pid...
    --kill可以用-s指定具体的信号发给指定的进程。
    --kill -s 2 2365  (SIGINT的值就是2,这个命令是将SIGINT信号发送给指定进程)
    --信号都是整数
    //捕捉信号
    #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:
            printf("SIGINT signal
    ");
            exit(0);
            break;
        case SIGALRM:
            printf("SIGALRM signal
    ");
            break;
        }
    }
    
    int main(int arg, char *args[])
    {
        signal(SIGINT,catch_signal);
        signal(SIGALRM,catch_signal);
        int i=0;
        while(1)
        {
            printf("hello god  %d
    ",i++);
            sleep(1);
        }
        return 0;
    }
    .SUFFIXES:.c .o
    CC=gcc
    SRCS=hello.c
    OBJS=$(SRCS:.c=.o)
    EXEC=tec
    
    start:$(OBJS)
        $(CC) -o $(EXEC) $(OBJS)
        @echo "^_^----OK----^_^"
    .c.o:
        $(CC) -Wall -g -o $@ -c $<
    clean:
        rm -f $(OBJS)
        rm -f $(EXEC)
  • 相关阅读:
    my ReadBook_dianzishangwu / 2020216 / dianzishangwuwuliu
    my ReadBook_shichangyingxiao / 2020208
    C#编写的clock
    Java建立JProgressBar
    java基本类型byte的取值范围
    正则表达式整理大全
    (C#)如何利用Graphics画出一幅图表
    设置鼠标可以移动窗体
    Java编程提高性能的26个方法
    数据加密工具设计经验
  • 原文地址:https://www.cnblogs.com/zhanggaofeng/p/5847152.html
Copyright © 2020-2023  润新知