gpt4 book ai didi

使用未初始化的 sigaction 结构调用 sigaction?

转载 作者:行者123 更新时间:2023-11-30 15:40:57 25 4
gpt4 key购买 nike

我在一些代码中看到以下用法:

struct sigaction term_handler;  // global variable without initialization
...
sigaction(SIGTERM, &term_handler, NULL); // install uninitialized sigaction for SIGTERM

这段代码似乎分配了一个sigaction struct,使其所有成员都为空或0,这让我非常困惑。如果触发 SIGTERM 会发生什么?

我使用以下代码进行了测试:

struct sigaction int_handler;
int main(int argc, char **argv) {
sigaction(SIGINT, &int_handler, NULL);
while(1) {}
return 0;
}

并使用“kill -2”进行测试,该进程无论如何都会被杀死。这是否意味着该进程采取了与其信号相关的默认操作?

最佳答案

SIG_DFL 在我的系统上为零,因此如果您有类似的系统,那么它会导致 SIGTERM 采取其默认行为。

除非先前修改了 SIGTERM 的行为(包括在程序被执行之前),否则这不会产生任何影响。如果是,则恢复默认行为(终止进程)。

<小时/>

以下演示:

a.c:

#include <signal.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>

static struct sigaction term_handler;

int main(int argv, char* argc[]) {
if (argv && strcmp(argc[0], "1") == 0)
sigaction(SIGTERM, &term_handler, NULL);

kill(getpid(), SIGTERM);
sleep(2);
return 0;
}

harness.c:

#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdio.h>

void test(const char* arg) {
pid_t pid = fork();
if (pid) {
int status;
waitpid(pid, &status, 0);
printf("%d\n", WIFSIGNALED(status) ? WTERMSIG(status) : 0);
} else {
struct sigaction term_handler;
char * const newargv[] = { "./a", arg, NULL };
char * const newenviron[] = { NULL };

term_handler.sa_handler = SIG_IGN;
sigaction(SIGTERM, &term_handler, NULL);

execve("./a", newargv, newenviron);
}
}

int main() {
test("0");
test("1");
return 0;
}

输出:

$ ./harness
0 # Without sigaction in child, wasn't killed by a signal
15 # With sigaction in child, was killed by TERM

关于使用未初始化的 sigaction 结构调用 sigaction?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20755252/

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