我有一个专门的Process type类的程序,它处理在linux上本地执行的进程。
它根本不使用Java的Process类,因为它需要对stream程进行一些特殊的处理。 因此,它还为SIGCHLD安装了自己的信号处理程序,以便知道进程何时退出。
不过,我只是在我的代码中添加了一个Runtime.exec()调用,显然它为SIGCHLD安装了自己的信号处理程序,这意味着我再也不会得到一个SIGCHLD ,这是不好的。 我遵循了oracle的信号链指令,但同样的问题发生,我从来没有得到一个SIGCHLD 。
所以,基本的问题是:在Java中链接SIGCHLD可能吗?
针对这种小型数据/命令广播应用的build议networking拓扑结构?
用于信号处理和用户pipe理的Python Unix / windows抽象层
使用Java将读取WAV文件时的采样率转换为采样数组
在windows上使用C将数据stream式传输到声卡
使用malloc / free on callstack从Signal Handler回溯linux 64位
点击ALSA音源
Cygwin中的信号处理行为
Sox(Swiss Army Knife)用于沉默和噪音去除的algorithm是什么
从任意audio文件中提取部分语音的好方法是什么?
在linux中使用signal.h编译错误
libJsig没有帮助,因为SIGCHLD处理程序是由libjava安装的,而不是由JVM本身安装的。
在java.lang.UNIXProcess的静态初始化程序中,使用sa_handler = SIG_DFL sigaction(SIGCHLD,...)仅由Java Class library调用一次。
现在您有以下选项可以解决这个问题。
最简单的一个。 只需在初始化java.lang.UNIXProcess 之后安装信号处理程序。
创建您自己的LD_PRELOAD钩子,它将拦截sigaction并在用SIGCHLD和SIG_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? 我假设你自己创建子进程代码。
总结以上是内存溢出为你收集整理的Java信号链接全部内容,希望文章能够帮你解决Java信号链接所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)