使用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上找到此示例。
答案 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);
}