/*
sigcation:可以读取和修改与指定信号相关联的处理动作
SYNOPSIS
#include <signal.h>
int sigaction(int signum, const struct sigaction *act,
struct sigaction *oldact);
sigaction()会依参数signum指定的信号编号来设置该信号的处理函数。
参数signum可以指定SIGKILL和SIGSTOP以外的所有信号。
const struct sigaction *act 传入参数
struct sigaction *oldact 传出参数(传改变前的act)
---------------------------------------------------------------------
The sigaction structure is defined as something like:
struct sigaction {
void (*sa_handler)(int); //函数
void (*sa_sigaction)(int, siginfo_t *, void *);
sigset_t sa_mask; //临时修改信号屏蔽字(mask)
int sa_flags; //一般设为0值
void (*sa_restorer)(void); //废弃不用
};
----------------------------------------------------------------------
信号处理函数可以采用void (*sa_handler)(int)或void (*sa_sigaction)(int, siginfo_t *, void *)。到底采用哪个要看sa_flags中是否设置了SA_SIGINFO位,如果设置了就采用void (*sa_sigaction)(int, siginfo_t *, void *),此时可以向处理函数发送附加信息;默认情况下采用void (*sa_handler)(int),此时只能向处理函数发送信号的数值。
sa_handler此参数和signal()的参数handler相同,代表新的信号处理函数,其他意义请参考signal()。
sa_mask 用来设置在处理该信号时暂时将sa_mask 指定的信号集搁置。
sa_restorer 此参数没有使用。
sa_flags 用来设置信号处理的其他相关操作,下列的数值可用。
sa_flags还可以设置其他标志:
SA_RESETHAND:当调用信号处理函数时,将信号的处理函数重置为缺省值SIG_DFL
··SA_RESTART:如果信号中断了进程的某个系统调用,则系统自动启动该系统调用
SA_NODEFER :一般情况下, 当信号处理函数运行时,内核将阻塞该给定信号。但是如果设置了 SA_NODEFER标记, 那么在该信号处理函数运行时,内核将不会阻塞该信号
*/
//捕捉信号ctr+c
#include <stdio.h>
#include <signal.h>
/*自定义的信号捕捉函数*/
void sig_int(int signo)
{
printf("catch signal SIGINT\n");//单次打印
}
int main(void)
{
struct sigaction act;
act.sa_handler = sig_int;
act.sa_flags = 0;
sigemptyset(&act.sa_mask); //不屏蔽任何信号
sigaction(SIGINT, &act, NULL); //SIGINT ctrl + c SIGQUIT ctrl + \
while(1);//该循环只是为了保证有足够的时间来测试函数特性
return 0;
}
/*
akaedu@akaedu-G41MT-D3:~/桌面/T74_system/0905_chp6_signal_set_operation_pause$ ./sigaction1
^Ccatch signal SIGINT
^Ccatch signal SIGINT
^Ccatch signal SIGINT
^\退出 (核心已转储)
*/<pre name="code" class="cpp">
/*自动屏蔽本信号,调用完毕后屏蔽自动解除*/
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
/*自定义的信号捕捉函数*/
void sig_int(int signo)
{
printf("catch signal SIGINT\n");
sleep(10); //模拟 信号处理函数执行很长时间
printf("end of handler\n");
}
int main(void)
{
struct sigaction act;
act.sa_handler = sig_int;
sigemptyset(&act.sa_mask); //依然不屏蔽任何信号
act.sa_flags = 0;
sigaction(SIGINT, &act, NULL); //注册信号处理函数
while(1);
return 0;
}
/*
$./sigaction2
^Ccatch signal SIGINT
end of handler
^Ccatch signal SIGINT
^C^Cend of handler
catch signal SIGINT
^Cend of handler
catch signal SIGINT
^Cend of handler
catch signal SIGINT
end of handler
^Ccatch signal SIGINT
^C^C^C^Cend of handler
catch signal SIGINT
^C^Cend of handler
catch signal SIGINT
^\退出 (核心已转储)
*/sigaction 读取和修改与指定信号相关联的处理动作 捕捉信号ctr+c
最新推荐文章于 2024-07-02 15:07:12 发布
本文详细介绍了sigaction函数的功能及用法,包括如何通过sigaction设置信号处理函数,并提供了两个示例程序说明不同场景下信号处理的行为差异。
307

被折叠的 条评论
为什么被折叠?



