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