通过一个例子使用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)时它不会转到handler函数。
所以请给出一些解决方案。
您可以在this link上找到这个示例。

最佳答案

当您调用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);
}

关于c - 使用sigaction()实现siginterrupt()吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39265386/

10-12 23:01