1. 注册信号函数
int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);
signum : 信号
act : 信号处理方法
oldact : 设置改变之前的值
2. 结构体
struct sigaction
{
__sighandler_t sa_handler; /* void sighandler(int signum) { } 形式的函数 */
__sigset_t sa_mask; /* sa_handler 处理过程中应该 block (无视) 的信号, sa_handler 结束后执行该信号的动作 */
int sa_flags; /* 默认 0 */
void (*sa_restorer) (void); /* NULL, 不使用 */
};
================================================================================
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
void sigfunc(int signum)
{
static int count;
printf("signal received. count %d\n", ++count);
printf("stop 10 second.....\n");
sleep(10);
printf("stop ends\n");
}
int main(int argc, char** arvg)
{
struct sigaction sigact;
memset(&sigact, 0, sizeof(sigact));
sigact.sa_handler = sigfunc;
sigemptyset(&sigact.sa_mask);
sigaddset(&sigact.sa_mask, SIGINT);
sigaddset(&sigact.sa_mask, SIGTERM);
sigact.sa_flags = 0;
sigact.sa_restorer = NULL;
if(sigaction(SIGINT, &sigact, NULL) < 0) {
fprintf(stderr, "Install Signal Action Error: %s\n", strerror(errno));
exit(1);
}
while('q' != getchar());
exit(0);
}
================================================================================
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
char *prompt = "Do you want to terminate the program?[y]";
void ctrl_c_op(int signo)
{
write(STDERR_FILENO, prompt, strlen(prompt));
char input[2];
fgets(input, 2, stdin);
if(input[0] == 'y')
exit(0);
}
int main()
{
struct sigaction act;
act.sa_handler = ctrl_c_op;
sigemptyset(&act.sa_mask);
act.sa_flags = 0;
if(sigaction(SIGINT, &act, NULL) < 0) {
fprintf(stderr, "Install Signal Action Error: %s\n", strerror(errno));
exit(1);
}
while(1);
}
0 件のコメント:
コメントを投稿