20

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

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

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

所以,基本问题是这样的:是否可以SIGCHLD在 Java 中进行链接?

4

2 回答 2

7

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

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

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

  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);
}
于 2014-08-12T22:55:53.557 回答
-2

使用套接字而不是 SIGCHLD 与您的子进程通信怎么样?我假设您自己创建子进程代码。

于 2014-08-11T13:55:24.263 回答