2012年4月1日日曜日

[C 语言] 信号处理 sigaction 简单实例

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 件のコメント:

コメントを投稿