#+SETUPFILE: ~/Dropbox/Doc/Org_Templates/level-1.org
signal 函数
#include <stdio.h>
#include <signal.h>
/**
* 使用: # ./test &
* # kill -SIGUSR1 pid
* # ./test # 然后输入 Ctrl-c
*
*/
void signal_handler(int signum)
{
if (signum == SIGUSR1) {
printf ("Receive signal SIGUSR1\n");
} else if (signum == SIGINT) {
/* Press down Ctrl-C in terminal */
printf ("Receive signal SIGINT\n");
} else {
printf ("Receive signal %d\n", signum);
}
}
int main(int argc, char *argv[])
{
signal(SIGUSR1, signal_handler);
signal(SIGINT, signal_handler);
for ( ; ; )
pause();
return 0;
}
sigaction
int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);
signal 的安全版本, 用法和 signal 一样, 还可以在触发 signum 的信号处理函数 的时候设置是否阻塞其他信号(由 act决定).
以下的示例代码在使用中, 如果使用 sigemptyset 的话, 屏蔽的信号集为空,
表示在 signal_handler
过程中不阻塞任何信号, 相反, sigfillset
阻塞所有信号. 如果在 signal_handler
发生过程中, 又接收到连续的 SIGINT
信号, 那么他也只 执行一次.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <signal.h>
void signal_handler(int n,struct siginfo *siginfo,void *myact)
{
printf("signal number:%d\n",n);
sleep(4);
}
int main(void)
{
struct sigaction act;
sigemptyset(&act.sa_mask); /* 设置初始信号集为空 */
//sigfillset(&act.sa_mask); /* 设置初始信号集为全部信号 */
act.sa_flags=SA_SIGINFO; /* SA_SIGINFO 表示传递附加信息到触发函数 */
act.sa_sigaction = signal_handler; /*设置信号处理函数*/
if (sigaction(SIGINT,&act,NULL) < 0) {
printf("install signal error\n");
}
for( ; ; ) {
printf("wait for the signal\n");
sleep(1);
}
}