使用sigaction()实现siginterrupt()?

时间:2016-09-01 07:33:26

标签: c linux

使用siginterrupt()通过一个示例实施sigaction()

#define _XOPEN_SOURCE 700

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>

void helpAndLeave(const char *progname, int status);
void pexit(const char *fCall);
int interrupt(int, int);
void handler(int);

int main(int argc, char *argv[]) {
    if (argc != 1) {
        helpAndLeave(argv[0], EXIT_FAILURE);
    }

    /* struct sigaction act;
       act.sa_handler = &handler;
     */

    interrupt(2,1);
//  while(1);

    exit(EXIT_SUCCESS);
}

void helpAndLeave(const char *progname, int status) {
    FILE *stream = stderr;

    if (status == EXIT_SUCCESS) {
        stream = stdout;
    }

    fprintf(stream, "Usage: %s", progname);
    exit(status);
}

void pexit(const char *fCall) {
    perror(fCall);
    exit(EXIT_FAILURE);
}

int interrupt(int signal, int flag) {

    printf("interrupt block\n");
    struct sigaction act;
    act.sa_handler = &handler;

    if (sigaction(SIGINT, NULL, &act) == -1) {
        return -1;
    }

    if (flag) {
        act.sa_flags &= ~SA_RESTART;
    } else {
        act.sa_flags &= SA_RESTART;
    }

    if (sigaction(SIGINT, &act, NULL) == -1) {
        printf("sigaction error\n");
        return -1;
    }
    printf("exit occur\n");
    while(1);
}

void handler(int signal) {
    printf("OMG, INTERRUPTION!!!!!\n");
}

这里输入(ctrl + c)时不会处理函数。

所以请给出一些解决方案。

您可以在this link上找到此示例。

1 个答案:

答案 0 :(得分:2)

当你致电sigaction(SIGINT, NULL, &act)时,它会用信号的当前处理程序覆盖act。因此,您对act.sa_handler的作业将被覆盖。您需要在强调之后进行分配,而不是之前。

通过位掩码开启的方法是|,而不是&,所以

    act.sa_flags &= SA_RESTART;

应该是:

    act.sa_flags |= SA_RESTART;

所以整个功能应该是:

int interrupt(int signal, int flag) {

printf("interrupt block\n");
struct sigaction act;

if (sigaction(SIGINT, NULL, &act) == -1) {
    return -1;
}

act.sa_handler = &handler;

if (flag) {
    act.sa_flags &= ~SA_RESTART;
} else {
    act.sa_flags |= SA_RESTART;
}

if (sigaction(SIGINT, &act, NULL) == -1) {
    printf("sigaction error\n");
    return -1;
}
printf("exit occur\n");
while(1);
}