Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 我最早能注册信号处理器的时间是多少?_C_Process_Signals_Posix_Startup - Fatal编程技术网

C 我最早能注册信号处理器的时间是多少?

C 我最早能注册信号处理器的时间是多少?,c,process,signals,posix,startup,C,Process,Signals,Posix,Startup,我有一个C语言的程序。我希望当它得到一个SIGTERM时,它总是以0的退出代码干净地退出。我最早可以注册信号处理器的地方是哪里?我把它加在我的主键的顶部,但我担心它可能会在信号寄存器之前得到一个sigterm 是否可以更早地注册信号处理程序?如果可以切换到C++:在程序启动和主要全局变量初始化之间。因此,在理论上,可以在调用main之前运行如下代码 int f() { signal(...); return 0; } int x = f(); 但您无法保证全局对象的初始化顺序,因此x可

我有一个C语言的程序。我希望当它得到一个SIGTERM时,它总是以0的退出代码干净地退出。我最早可以注册信号处理器的地方是哪里?我把它加在我的主键的顶部,但我担心它可能会在信号寄存器之前得到一个sigterm


是否可以更早地注册信号处理程序?

如果可以切换到C++:在程序启动和主要全局变量初始化之间。因此,在理论上,可以在调用main之前运行如下代码

int f() {
  signal(...);
  return 0;
}
int x = f();
但您无法保证全局对象的初始化顺序,因此x可能不是首先初始化的,而是最后初始化的

但是回到您最初的请求:启动程序和main之间的时间如此之短,为什么您要准备在这么短的时间内阻止某人发送SIGTERM?这不太可能发生吗

如果可能,您可以将父级更改为忽略SIGTERM,然后更改为fork和execve。说

通过fork2创建的子对象继承其父对象的副本 信号处理。在执行过程中,对 处理过的信号被重置为默认值;处置 忽略的信号保持不变


因此,您可以忽略SIGTERM启动进程,直到它为SIGTERM设置了一个处理程序。

如果您可以切换到C++:在程序启动和主全局变量之间初始化。因此,在理论上,可以在调用main之前运行如下代码

int f() {
  signal(...);
  return 0;
}
int x = f();
但您无法保证全局对象的初始化顺序,因此x可能不是首先初始化的,而是最后初始化的

但是回到您最初的请求:启动程序和main之间的时间如此之短,为什么您要准备在这么短的时间内阻止某人发送SIGTERM?这不太可能发生吗

如果可能,您可以将父级更改为忽略SIGTERM,然后更改为fork和execve。说

通过fork2创建的子对象继承其父对象的副本 信号处理。在执行过程中,对 处理过的信号被重置为默认值;处置 忽略的信号保持不变


因此,您可以开始忽略SIGTERM的进程,直到它为SIGTERM设置了一个处理程序。

是的,您可以。使用特定于平台的初始值设定项,如gcc的_attributeconstructor。但这并不是一个可靠的解决方案

如果希望在获得SIGTERM时始终以0的退出代码干净地退出,则指示生成代码的进程以SIGTERM blocked开始

然后,您的main可以注册一个信号处理程序,并使用sigprocmask或pthread_sigmask解除对SIGTERM的阻塞,在这一点上,如果在进程创建到信号解除阻塞调用之间的任何时间点收到信号处理程序,信号处理程序将立即运行

从本质上讲,它将延迟信号的传递,直到您准备好处理它为止


请注意,如果您在启动过程时忽略了信号而不是阻塞了信号,那么在忽略信号之前接收到的任何信号实例都将丢失,就好像它们从未发生过一样。这似乎违背了你的要求。

是的,你可以。使用特定于平台的初始值设定项,如gcc的_attributeconstructor。但这并不是一个可靠的解决方案

如果希望在获得SIGTERM时始终以0的退出代码干净地退出,则指示生成代码的进程以SIGTERM blocked开始

然后,您的main可以注册一个信号处理程序,并使用sigprocmask或pthread_sigmask解除对SIGTERM的阻塞,在这一点上,如果在进程创建到信号解除阻塞调用之间的任何时间点收到信号处理程序,信号处理程序将立即运行

从本质上讲,它将延迟信号的传递,直到您准备好处理它为止


请注意,如果您在启动过程时忽略了信号而不是阻塞了信号,那么在忽略信号之前接收到的任何信号实例都将丢失,就好像它们从未发生过一样。这似乎违背了你的要求。

如果这是很容易预防的,那么我想预防它。“如果没有办法,我愿意在知道情况不太可能的情况下得到安慰。”user7610我添加了另一个选项。也许这更适合你的需要。有趣。是否有任何实际的软件执行fork+exec程序来微调信号处理?fork+exec。。。是父进程启动子进程的标准方式。int x=f;在文件范围内不严格遵守C代码。静态对象的运行时初始化是C++特性,如果它是可以避免的,那么我想阻止它。“如果没有办法,我愿意在知道情况不太可能的情况下得到安慰。”user7610我添加了另一个选项。也许这更适合你的需要。有趣。是否有任何实际的软件执行fork+exec程序来微调信号处理
k+执行。。。是父进程启动子进程的标准方式。int x=f;在文件范围内不严格遵守C代码。静态对象的运行时初始化是C++特性。我用Python Web服务器尝试过。python-mhttp.server8888&sleep2;kill-2%%python以0退出,python-m http.server 8888&kill-2%%python以130退出,因为它没有时间开始处理键盘中断异常。我想我可以忍受一个信号还没有工作的短暂时期。根据一些答案从父级调整信号掩码可能不值得这样做。我可以创建一个Python启动脚本,并在启动程序时使用它来屏蔽SIGTERM。你为什么担心在第一行main之前得到一个SIGTERM?通常,程序不需要在启动主函数之前清理它所做的任何事情。“你有一个必须清理的房间吗?”安德烈亚斯·温泽尔不,据我所知没有。我只是想在我的程序运行时有一个统一的行为。我想让它有一个干净的出口。我意识到,如果启动后太快收到信号,我就不能这么做。。。除非我像答案所示首先阻止来自父级的信号…@user7610,否则假设一个完美的robutst操作系统内核,如果你甚至在分叉之前就阻止了信号,然后在分叉之后在父级中取消阻止它,那么这可能具有最终的健壮性。Post-fork&pre-exec允许在一个窗口中终止进程。python-mhttp.server8888&sleep2;kill-2%%python以0退出,python-m http.server 8888&kill-2%%python以130退出,因为它没有时间开始处理键盘中断异常。我想我可以忍受一个信号还没有工作的短暂时期。根据一些答案从父级调整信号掩码可能不值得这样做。我可以创建一个Python启动脚本,并在启动程序时使用它来屏蔽SIGTERM。你为什么担心在第一行main之前得到一个SIGTERM?通常,程序不需要在启动主函数之前清理它所做的任何事情。“你有一个必须清理的房间吗?”安德烈亚斯·温泽尔不,据我所知没有。我只是想在我的程序运行时有一个统一的行为。我想让它有一个干净的出口。我意识到,如果启动后太快收到信号,我就不能这么做。。。除非我像答案所示首先阻止来自父级的信号…@user7610,否则假设一个完美的robutst操作系统内核,如果你甚至在分叉之前就阻止了信号,然后在分叉之后在父级中取消阻止它,那么这可能具有最终的健壮性。Post fork&pre exec允许在一个窗口中终止进程。