Linux——信号处理函数sigaction()

sigaction()

作用:设置某信号的信号处理函数

1. sigaction()函数原型

#include 
int sigaction (	int signo, 
		const struct sigaction* restrict act, 
		struct sigaction* restrict oldact
		);
  • signo:指定的信号,可以为除SIGKILL 及SIGSTOP外的任何信号
  • act:信号处理方式
  • oldact:旧的信号处理方式 将存储到此指针指向的结构体中
  • sigaction()函数只能在POSIX支持的系统上使用(POSIX:Portable Operating System Interface of UNIX,可以指操作系统接口。其定义了操作系统应该为应用程序提供的标准接口)

2. sigaction结构体

struct sigcation
{
	void (*sa_handler)(int);
	void (*sa_sigaction)(int, siginfo_t*, void*);
	sigset_t sa_mask;
	int sa_flags;
	void (*sa_restorer)(void);
};
  • sa_handler:与signal()函数的handler参数相同,主要用于对signal()信号的支持
  • sigaction:新的信号处理函数指针。该信号处理函数应带有三个参数,类型分别为int,struct siginfo,void,返回值为void。
    – 第一个参数为信号值;
    – 第二个参数为指向结构体siginfo的指针,此结构体中包含信号的信息;
    – 第三个参数没有使用
  • sa_mask:信号集,执行信号处理函数时,暂时将信号集中的信号搁置。默认为当前信号。
  • sa_flags:标志位,用于设置信号处理的其他相关操作
    – SA_SIGINFO:使用sa_sigaction作为信号处理函数
    – SA_NODEFER:在执行信号处理函数时,不阻塞当前信号
    – SA_RESETHAND:当用户注册的信号处理函数被执行过一次后,该信号的处理函数被设为系统默认的处理函数
    – SA_RESTATR:由此信号中断的系统调用会自动重启
    – SA_INTERRUPT:由此信号中断的系统调用不会自动重启
    – 其他
  • sa_restorer:此参数没有使用

3. siginfo结构体

struct siginfo {
    int      si_signo;        /* signal number */
    int      si_errno;        /* if nonzero, errno value from  */
    int      si_code;         /* additional info (depends on signal) */
    pid_t    si_pid;          /* sending process ID */
    uid_t    si_uid;          /* sending process real user ID */
    void    *si_addr;         /* address that caused the fault */
    int      si_status;       /* exit value or signal number */
    long     si_band;         /* band number for SIGPOLL */
    /* possibly other fields also */
};

4. 应用示例

/*sigcation() test*/
#include 
#include 
#include 
#include 
#include 

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

int main()
{
	struct sigaction act;
	int sig;
	//设置结构体sigaction的值
	sigemptyset(&act.sa_mask);
	act.sa_flags=SA_SIGINFO;	//使用sa_sigaction作为信号处理函数
	act.sa_sigaction=new_handle;
	//设置要捕捉的信号
	sig=SIGINT;
	
	if(sigaction(sig, &act, NULL)<0)
	{
		perror("install signal error");
		return -1;
	}
	while(1)
	{
		sleep(2);
		printf("wait for the signal\n");
	}
	return 0;
}
//信号处理函数
void new_handle(int signo, siginfo_t* siginfo, void *rest)
{
	printf("new handle get a signo ~\n");
	exit(0);
}

运行结果:
Linux——信号处理函数sigaction()_第1张图片
每隔两秒打印一次“wait for the signal”,在键盘上按下CTRL+C后,跳到new_handle()函数里打印“new handle get a signo~”之后再退出。

参考:

  1. 信号之sigaction函数
  2. sigaction用法实例
  3. sigaction函数解析
  4. sigaction函数使用实例
  5. Linux 进程------sigaction 函数解析
  6. POSIX

你可能感兴趣的:(Linux)