gpt4 book ai didi

c - 使用 sigaction() 实现 siginterrupt()?

转载 作者:太空宇宙 更新时间:2023-11-04 08:11:14 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com