gpt4 book ai didi

c - 程序是否有可能捕获由退出系统调用生成的 SIGTERM?

转载 作者:太空狗 更新时间:2023-10-29 15:03:41 29 4
gpt4 key购买 nike

我的程序如下:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <signal.h>

int main()
{
struct sigaction new_sa;
struct sigaction old_sa;
sigfillset(&new_sa.sa_mask);
new_sa.sa_handler = SIG_IGN;
new_sa.sa_flags = 0;
int input;

if (sigaction(SIGTERM, &new_sa, &old_sa) == 0 && old_sa.sa_handler != SIG_IGN) {
new_sa.sa_handler = NULL;
sigaction(SIGTERM, &new_sa, 0);
}

printf("Pgm is running\n");
while (1) {
printf("Enter input\n");
scanf("%d", &input);
if (!input) {
/* I actually call a libraries API which calls exit()
* Just calling exit here for simpilicity */
exit(1);
}
}
}

我想处理/忽略由退出系统调用生成的 SIGTERM。是否可以?我无法避免调用 exit,因为它实际上是一个库调用,它试图退出我想避免的程序。

最佳答案

你当然可以捕获SIGTERM .但这不是这里的问题。你想覆盖 exit()打电话。

这在任何可移植或符合标准的方式中都是不可能的。 exit()是定义为返回其调用者的函数之一。通常,这是使用 __attribute__((noreturn)) 完成的在 gcc 和 C11 中引入了宏 _Noreturn出于同样的目的。

试图从这样的函数返回,比如exit() , 是 undefined behaviour .

我能想到的选项很少:

  • 编译并替换为您的函数:gcc -Dexit=not_exit file.c
  • exit()写一个钩子(Hook)函数.参见 here举个例子。实现 Hook 函数可能根本不起作用,因为此 noreturn 在 C11 的 _Noreturn 之前已存在于大多数 libc 实现中.
  • 按照@evading 的建议使用GNU 的ld。我相信这等同于上述内容,但链接器为您完成了一半的工作。

修改 <stdlib.h>删除 _Noreturn exit() 的(或其等效)属性功能可能会使它工作。这些都不能保证有效。我们已经深入 UB 土地。

其他选项是安装 atexit()处理程序,如果你想在 exit() 之前做某事,这可能会有用。 .

如果您不调用 exit(),则更明智的方法是修改库而是返回错误代码。在我看来,要么库设计不当,它会自行随机退出,要么可能有一个很好的理由让库退出(由于一些不可恢复的错误)并且您的应用程序不应该继续继续,而您正在尝试做。

关于c - 程序是否有可能捕获由退出系统调用生成的 SIGTERM?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33936062/

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