Java信号链

Java信号链,java,linux,signal-handling,sigchld,runtime-environment,Java,Linux,Signal Handling,Sigchld,Runtime Environment,我有一个程序,它有一个专门的进程类型的类,在Linux上处理本机执行进程 它根本不使用Java的类,因为它需要对流程进行一些特殊处理。因此,它还为sigchd安装自己的信号处理程序,以便知道进程何时退出 然而,我只是在我的代码中添加了一个Runtime.exec()调用,它显然为SIGCHLD安装了自己的信号处理程序,这意味着我再也不会得到SIGCHLD,这很糟糕。我遵循了中的信号链接说明,但同样的问题也发生了,我从未得到SIGCHLD 因此,基本问题是:是否可以在Java中链接SIGCHLD?

我有一个程序,它有一个专门的
进程
类型的类,在Linux上处理本机执行进程

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

然而,我只是在我的代码中添加了一个
Runtime.exec()
调用,它显然为
SIGCHLD
安装了自己的信号处理程序,这意味着我再也不会得到
SIGCHLD
,这很糟糕。我遵循了中的信号链接说明,但同样的问题也发生了,我从未得到
SIGCHLD


因此,基本问题是:是否可以在Java中链接
SIGCHLD

使用套接字代替SIGCHLD与子进程通信?
我假设您自己创建子进程代码。

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

sigaction(SIGCHLD,…)
with sa_handler=
SIG_DFL
仅由Java.lang.UNIXProcess的静态初始值设定项中的Java类库调用一次

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

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

  • 创建自己的
    LD_PRELOAD
    钩子,该钩子将拦截
    sigaction
    并在使用
    SIGCHLD
    SIG_DFL
    参数调用时忽略它:

  • 例如

    定义GNU源
    #包括
    #包括
    #包括
    int-sigaction(int-signum,const-struct-sigaction*act,struct-sigaction*oldact){
    静态int(*real_sa)(int,const struct sigaction*,struct sigaction*)=NULL;
    if(signum==SIGCHLD&&act->sa_handler==SIG_DFL){
    返回0;
    }
    如果(实值=空){
    real_sa=dlsym(RTLD_NEXT,“sigaction”);
    }
    返回real_sa(签名、行为、旧行为);
    }
    
    您尝试了上述两种方法中的哪一种?使用
    LD_PRELOAD
    ;我还没有尝试过制作一个嵌入JVM的应用程序。我还将奖励100美元给成功的答案。(我现在不能回答,因为一次只能回答一个问题)您是否尝试过java的
    -Xrs
    选项?
    #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);
    }