rm5*_*248 19 java linux runtime-environment signal-handling sigchld
我有一个带有专门Process类的程序,它在Linux上本地处理执行进程.
它根本不使用Java的Process类,因为它需要对进程进行一些特殊处理.因此,它还安装了自己的信号处理程序SIGCHLD,以便它知道进程何时退出.
但是,我刚刚Runtime.exec()在我的代码中添加了一个调用,它显然安装了自己的信号处理程序SIGCHLD,这意味着我再也没有得到它SIGCHLD,这很糟糕.我遵循了oracle的信号链接指令,但同样的问题发生了,我从来没有得到过SIGCHLD.
所以,基本问题是:是否有可能SIGCHLD在Java中链接?
libjsig没帮助,因为SIGCHLD处理程序是libjava由JVM本身安装的,而不是由JVM本身安装的.
sigaction(SIGCHLD, ...)sa_handler = SIG_DFL只在java.lang.UNIXProcess的静态初始化程序中由Java类库调用一次.
现在,您可以使用以下选项来解决此问题.
最简单的一个.只需在初始化后安装信号处理程序java.lang.UNIXProcess.
创建自己的LD_PRELOAD钩子,sigaction在使用SIGCHLD和SIG_DFL参数调用时将拦截并忽略它:
例如
#define _GNU_SOURCE
#include <signal.h>
#include <dlfcn.h>
#include <stddef.h>
int sigaction(int signum, const struct sigaction* act, struct sigaction* oldact) {
static int (*real_sa)(int, const struct sigaction*, struct sigaction*) = NULL;
if (signum == SIGCHLD && act->sa_handler == SIG_DFL) {
return 0;
}
if (real_sa == NULL) {
real_sa = dlsym(RTLD_NEXT, "sigaction");
}
return real_sa(signum, act, oldact);
}
Run Code Online (Sandbox Code Playgroud)