0
sigaction()
を使用してsiginterrupt()
を実装してください。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にあります。
初めて 'sigaction'を呼び出すと' act'が上書きされますので、 'act.sa_hアンドラーは失われる。 – Barmar