Ответ 1
libjsig
не помогает, поскольку SIGCHLD
обработчик установлен libjava
, а не сам JVM.
sigaction(SIGCHLD, ...)
с sa_handler = SIG_DFL
вызывается только один раз библиотекой классов Java в статическом инициализаторе java.lang.UNIXProcess.
Теперь у вас есть следующие варианты обхода этого.
-
Самый простой. Просто установите обработчик сигнала после инициализации
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);
}