Java信号链

rm5*_*248 19 java linux runtime-environment signal-handling sigchld

我有一个带有专门Process类的程序,它在Linux上本地处理执行进程.

它根本不使用Java的Process类,因为它需要对进程进行一些特殊处理.因此,它还安装了自己的信号处理程序SIGCHLD,以便它知道进程何时退出.

但是,我刚刚Runtime.exec()在我的代码中添加了一个调用,它显然安装了自己的信号处理程序SIGCHLD,这意味着我再也没有得到它SIGCHLD,这很糟糕.我遵循了oracle的信号链接指令,但同样的问题发生了,我从来没有得到过SIGCHLD.

所以,基本问题是:是否有可能SIGCHLD在Java中链接?

apa*_*gin 6

libjsig没帮助,因为SIGCHLD处理程序是libjava由JVM本身安装的,而不是由JVM本身安装的.

sigaction(SIGCHLD, ...)sa_handler = SIG_DFL只在java.lang.UNIXProcess的静态初始化程序中由Java类库调用一次.

现在,您可以使用以下选项来解决此问题.

  1. 最简单的一个.只需初始化安装信号处理程序java.lang.UNIXProcess.

  2. 创建自己的LD_PRELOAD钩子,sigaction在使用SIGCHLDSIG_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)