sigaction 读取和修改与指定信号相关联的处理动作 捕捉信号ctr+c

/*
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)