signal

作者: thebeeman | 来源:发表于2018-01-08 15:19 被阅读0次

    信号:

    信号是组概念,发送方和接收方需要配对存在,比如进程A发送信号X给进程B,进程B接收信号按信号处理函数进行响应,具体的处理流程是:

    1.1 用户按下Ctrl-C,这个键盘输入产生一个硬件中断。

    1.2 该进程的用户空间代码暂停执行,CPU从用户态切换到内核态处理硬件中断。

    1.3 终端驱动程序将Ctrl-C解释成一个SIGINT信号,记在该进程的PCB中(也可以说发送了一个SIGINT信号给该进程)。

    1.4 内核返回到该进程的用户空间代码继续执行之前,首先处理PCB中记录的信号,发现有一个SIGINT信号待处理,而这个信号的默认处理动作是终止进程,所以直接终止进程而不再返回它的用户空间代码执行。

    2. 信号集有哪些?

    kill -l && man 7 signal

    3. 触发信号的常用操作

    Ctrl-C SIGINT

    Ctrl-\ SIGQUI

    Ctrl-Z SIGTSTP

    kill -l USERSIG PID

    4. 相关AP

    I//为信号设置处理方法

    int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);//sigprocmask, rt_sigprocmask - examine and change blocked signals

    //为进程添加阻塞信号集,表示进程接收到其中的信号并不立即处理,而是等到进程解除阻塞后再处理

    int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);//添加信号到信号集中int sigaddset(sigset_t *set, int signum);//从信号集中删除信号int sigdelset(sigset_t *set, int signum);

    //判断信号是否是信号集中元素?

    int sigismember(const sigset_t *set, int signum);

    5. struct sigaction之sa_mask与sa_mask

    struct sigaction { 

     void (*sa_handler)(int); 

     void (*sa_sigaction)(int, siginfo_t *, void *); 

     sigset_t sa_mask; 

     int sa_flags; 

     void (*sa_restorer)(void);};

    sa_mask是信号阻塞集sa_flags是信号修改标志

    6. 代码

    #include <stdio.h>

    #include <signal.h>

    void

    main(int argc, char *argv[])

    {

            struct sigaction act;

            sigemptyset(&act.sa_mask);

            act.sa_flags = 0;

            act.sa_handler = sig_int_handler;

            sigaction(SIGINT, &act, NULL);

            sleep(3);

            printf("Sample for signal programming end\n");

    }

    void

    sig_int_handler(int signum)

    {

            printf("Got a signal of %d\n", signum);

    }

    相关文章

      网友评论

          本文标题:signal

          本文链接:https://www.haomeiwen.com/subject/ousbnxtx.html