【问题标题】:How to install a signal handler names sig_handler如何安装信号处理程序名称 sig_handler
【发布时间】:2017-04-14 10:14:46
【问题描述】:
您好,我已经完成了这段代码,但是我需要添加一些东西。
- 忽略信号 SIGINT
- 将 SIGINT 的信号处理程序恢复为默认值
- 捕捉信号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 将被忽略,但第二次不会(因为我正在将其恢复为默认行为)