首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用sigaction()实现siginterrupt()?

使用sigaction()实现siginterrupt()?
EN

Stack Overflow用户
提问于 2016-09-01 15:33:26
回答 1查看 503关注 0票数 0

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

代码语言:javascript
复制
#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上找到这个例子。

EN

回答 1

Stack Overflow用户

发布于 2016-09-01 15:48:01

当您调用sigaction(SIGINT, NULL, &act)时,它会用信号的当前处理程序覆盖act。因此,您对act.sa_handler的赋值将被覆盖。您需要在调用之后执行该赋值,而不是在调用之前。

在位掩码中打开位的方法是使用|,而不是&,所以

代码语言:javascript
复制
    act.sa_flags &= SA_RESTART;

应该是:

代码语言:javascript
复制
    act.sa_flags |= SA_RESTART;

所以整个函数应该是:

代码语言:javascript
复制
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);
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39265386

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档