Mamy aplikację C++ z wbudowanym JVM (Sun's). Ponieważ rejestrujemy własne procedury obsługi sygnałów, zaleca się, abyśmy to zrobili przed zainicjowaniem maszyny JVM, ponieważ instaluje ona własne procedury obsługi (see here).Łańcuch sygnałów JVM SIGPIPE
Z tego co zrozumiałem, JVM zna wewnętrznie, jeśli sygnał pochodzi z własnego kodu, a jeśli nie, przekazuje go wzdłuż łańcucha - naszym handlerom.
Co zaczęliśmy widząc, że jesteśmy coraz SIGPIPEs, ze stosu wywołań, który wygląda mniej więcej tak (górna pozycja jest nasz obsługi sygnału):
/.../libos_independent_utilities.so(_ZN2os32smart_synchronous_signal_handlerEiP7siginfoPv+0x9) [0x2b124f7a3989]
/.../jvm/jre/lib/amd64/server/libjvm.so [0x2aaaab05dc6c]
/.../jvm/jre/lib/amd64/server/libjvm.so [0x2aaaab05bffb]
/.../jvm/jre/lib/amd64/server/libjvm.so(JVM_handle_linux_signal+0x718) [0x2aaaab05e878]
/.../jvm/jre/lib/amd64/server/libjvm.so [0x2aaaab05bf0e]
/lib64/libpthread.so.0 [0x3c2140e4c0]
/lib64/libpthread.so.0(send+0x91) [0x3c2140d841]
/.../jvm/jre/lib/amd64/libnet.so [0x2aaabd360269]
/.../jvm/jre/lib/amd64/libnet.so(Java_java_net_SocketOutputStream_socketWrite0+0xee) [0x2aaabd35cf4e]
[0x2aaaaeb3bf7f]
Wydaje się, że JVM jest zdecydować, że SIGPIPE, który został podniesiony z send
powinien zostać przekazany do naszego handsera sygnału. Czy to prawda, kiedy to robisz?
Ponadto, dlaczego stos wywołań jest niekompletny? Mam na myśli oczywiście to nie może pokazać mi kod Java przed socketWrite0
, ale dlaczego nie widzę stos przed kod Java?
Czy zainstalowałeś program obsługi sygnału dla SIGPIPE? (jeśli tak, to tak - często uzyskuje się SIGPIPE z wywołań send(), gdy ktoś pisze do uszkodzonego gniazda). – nos
Wiem, że 'send' może wywołać SIGPIPE. Po prostu kwestionuję decyzję JVM, aby przekazać mi je, dlaczego nie stanowi wyjątku? –
Ale nie zainstalowałeś dla niego programu obsługi? – nos