C++ C++;流程管理:WinAPI“;SetProcessShutdownParameters";在Linux中?

C++ C++;流程管理:WinAPI“;SetProcessShutdownParameters";在Linux中?,c++,linux,process,C++,Linux,Process,在Windows(7)中,在VC++中,我们可以设置“进程关闭参数”(在XP中,父进程将在子进程之前自动关闭),以确保在子进程之前杀死父进程,如下所示: GetProcessShutdownParameters(&shutdownlevel, &shutdownflags); SetProcessShutdownParameters(shutdownlevel+1, SHUTDOWN_NORETRY); 如何在C++(Linux)上实现这一点?在许多论坛上,我发现了很多关于如何

在Windows(7)中,在VC++中,我们可以设置“进程关闭参数”(在XP中,父进程将在子进程之前自动关闭),以确保在子进程之前杀死父进程,如下所示:

GetProcessShutdownParameters(&shutdownlevel, &shutdownflags);
SetProcessShutdownParameters(shutdownlevel+1, SHUTDOWN_NORETRY);

如何在C++(Linux)上实现这一点?在许多论坛上,我发现了很多关于如何确保在父进程死亡的情况下杀死子进程的讨论(例如,在Linux上使用prctl),但我没有发现任何关于如何保证在子进程之前由操作系统杀死父进程的讨论,就像上面针对Windows的讨论一样。也许它在Linux中是自动的

Unix世界中的系统关闭工作方式有点不同

当系统关闭时,首先调用关闭脚本,该脚本处理任何复杂或耗时的任务,当脚本运行后,所有剩余的进程首先发送一个
SIGTERM
信号(该信号会终止任何没有显式处理程序的进程),几秒钟后,一个
SIGKILL
信号(它终止进程并且无法处理)

最后一部分发生的顺序未定义

通常,应编写程序,以便只需发送
SIGTERM
即可关闭程序

我猜您希望在子对象之前停止父对象,因为父对象只需重新启动子对象。避免这种情况的正确方法是收集孩子的退出状态(你无论如何都要负责),并避免在退出状态表明进程因被发送而结束时重新启动
SIGTERM


(您仍然希望在
SIGKILL
上重新启动,因为当系统内存不足时,最大的进程会发生这种情况)

我认为没有任何系统功能可以实现这一点。老实说,我很好奇为什么你需要父母的过程在孩子死之前就结束了:我自己找不到任何理由。愿意分享吗?通常,您希望您的家长监视孩子,并在检测到孩子死亡时采取操作(退出),但这当然意味着家长在孩子死后退出。我需要操作系统发送“kill”首先向父进程发送信号,因为我需要确保子进程不会被操作系统随机终止,而是会被父进程终止(这意味着将完成清理等)。但是,当我在发出shutdown命令之前检查正在运行的进程时,当第一个脚本从RL 0/6执行时,似乎在操作系统移动到执行/etc/init.d中的脚本之前,一些进程已经被终止。知道什么时候以及为什么吗?在关闭脚本运行之前终止的进程是直接从init启动的进程,即
inittab
中列出的进程。子进程不应该依赖父进程进行清理,就这么简单。进程因系统关闭以外的原因死亡,即使在这种情况下,系统也应以最佳方式运行。“子进程不应依赖父进程进行清理”:完全同意。不幸的是,有时有比我们聪明的个人更强大的(公司)力量。所以我不能改变这个。我运行了自己的应用程序,并用ps-command验证它是否正在运行。我注意到它是在RL0中的第一个脚本执行之前被杀死的(我将这个检查添加到正在执行的第一个脚本中,我的应用程序已经被杀死)。知道为什么吗?这是我无法理解的事实。正如您提到的,我还认为在执行系统脚本之后,用户应用程序会被SIGTERM信号(发送到所有进程)杀死。但情况似乎并非如此。。。。或者我误解了什么。此外,在shell中运行的进程似乎首先被终止。所以基本顺序是:1)在inittab中关闭进程,2)在rl0中执行脚本?我读了这个链接,但问题仍然没有解决:谢谢你的帮助。