【问题标题】:How to install a signal handler names sig_handler如何安装信号处理程序名称 sig_handler
【发布时间】:2017-04-14 10:14:46
【问题描述】:

您好,我已经完成了这段代码,但是我需要添加一些东西。

  1. 忽略信号 SIGINT
  2. 将 SIGINT 的信号处理程序恢复为默认值
  3. 捕捉信号SIGINT并打印出信号的数值

到目前为止,这是我拥有的编码

      void sig_handler(int signo)
    {
    // body of signal handler
    }

    int main()
{
    struct sigaction act;
    act.sa_flags = 0;
    act.sa_handler = sig_handler;
    sigfillset( & (act.sa_mask) );

if (sigaction(sig, &act, NULL) != 0) 
    {
         perror("sigaction"); exit(1);
    }
}

【问题讨论】:

  • 问题是?
  • 您想编写一个捕获 SIGINT 并打印其数值的代码吗?你想做更多的事情吗?有关如何编写代码的提示,请参阅 this

标签: c linux ubuntu unix signals


【解决方案1】:

这样的事情会让你开始。

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

void    handle_signal(int signum)
{
    printf("\nRecived signal: %d\n", signum);
    switch(signum)
    {
        case SIGINT:
            printf("I won't respond to ctrl-c!\n");

            //restore to default
            signal(SIGINT, SIG_DFL);
            break;
        case SIGWINCH:
            //windows size change
            break;
        case SIGCONT:
            //continue process 'fg' in terminal
            break;
        case SIGTSTP:
            //ctrl-z
            break;
        default:
            //others
            break;
    }
}

void        listen_to_signals(void)
{
    int     i;

    i = 0;
    while (i < 32)
    {
        if (i != SIGKILL && i != SIGSTOP && i != SIGCHLD && i != SIGCONT &&
            i != SIGURG && i != SIGIO)
            signal(i, &handle_signal);
        i++;
    }
}

int     main()
{
    listen_to_signals();
    while(1)
    {}
}

请注意,我正在倾听所有我能听到的信号:有些信号我无法听到(比如 kill)。

注意:使用'kill -9 pidof your_program'来阻止它

注意:第一次SIGINT 将被忽略,但第二次不会(因为我正在将其恢复为默认行为)

【讨论】:

    猜你喜欢
    • 2022-06-14
    • 2014-02-06
    • 2011-08-15
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多