通过一个例子使用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/