通过一个示例,使用sigaction()实现siginterrupt()。
#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上找到这个例子。
发布于 2016-09-01 15:48:01
当您调用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);
}https://stackoverflow.com/questions/39265386
复制相似问题