我是靠谱客的博主 洁净羽毛,最近开发中收集的这篇文章主要介绍java子进程_Java:如何在子进程,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

你可以用一点C来做,只要你不担心一些条件,并明白它会有局限性。

prctl(PR_SET_PDEATHSIG, …)系统调用是linux内核的一部分,并且有一些规则 - 它不会生存fork(),它不会生存exec()到setuid / setgid二进制文件。

限制是:

这是一个简单的程序,如果你从子进程中启动其他东西,将杀死一些东西,除非你设置了一些限制。

它不会在可执行模型(例如32-> 64bit)之间工作,这是相对罕见的

它不能使用静态链接二进制文件(罕见)

考虑到这些限制,我们可以从一些将调用此系统调用的C创建一个小的预加载库。所以,例如:

#include

#include

#include

__attribute__((constructor))

static void on_load() {

prctl(PR_SET_PDEATHSIG, SIGTERM);

}

使用gcc -fPIC -shared -o term_death.so term_death.c编译

当您使用LD_PRELOAD环境变量以及此二进制文件的完整路径时,任何启动的程序将在其父进程被终止时发送SIGTERM。

这是来自C方面的设置 - 我们现在有一个帮助程序库,它将允许您要求的行为。

从java端开始工作。

我们需要将.so的完整路径注入到ProcessBuilder的LD_PRELOAD环境变量中,如下所示:

ProcessBuilder pb = new ProcessBuilder();

Map env = pb.environment();

env.put("LD_PRELOAD", "/home/me/development/experiments/term_death.so");

再次,您需要指定.so的路径,以便可以加载它。

当您pb.start()时,它将继承LD_PRELOAD环境变量。在加载可执行文件时,它会运行on_load代码(因为它被标记为构造函数)并且表示当父进程终止时进程将收到SIGTERM。

这有点难看,但应该解决这个问题。

最后

以上就是洁净羽毛为你收集整理的java子进程_Java:如何在子进程的全部内容,希望文章能够帮你解决java子进程_Java:如何在子进程所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(57)

评论列表共有 0 条评论

立即
投稿
返回
顶部