Java信号链接

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

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

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

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

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

在java.lang.UNIXProcess的静态初始化程序中,使用sa_handler = SIG_DFL sigaction(SIGCHLD, ...)仅由Java Class Library调用一次。

现在您有以下选项可以解决这个问题。

  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); } 

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