I tested your code. It works fine on my machine with 2.6.4. I tested Sun JDK 1.3.1fcs, 1.3.1_10, 1.3.1_11, 1.4.2fcs, 1.4.2_03 and 1.5beta. SignalTest is able to catch HUP, TERM, INT.
That said, I'd like to point out that the Java level signal API is private interface. Its sole purpose is to implement the shutdown mechanism (see Runtime.addShutdownHook). The interface may change or get dropped completely without notice in future JDK. So use at your own risk. (If you really want to catch signals, it's better to write JNI code; signals have well-defined behavior at C level, but not at Java level).
regards, -hui
nicole wrote:
Ah, the IBM JDK was holding the signals for the JVM, that explains why that didn't work (had to use -Xrs).
Works with 2.6: IBM 1.3.1-6 (with -Xrs) Sun 1.4.2_03 (no -Xrs)
Does Not Work with 2.6: Blackdown 1.3.1 Sun 1.3.1_10 Sun 1.3.1_11
Untested: Blackdown 1.4.x IBM 1.4.x
Everything tested works fine on a 2.4 kernel.
Attached is the test code that I am using to test the signals.
Feedback welcome... otherwise I am most likely going to test and switch to the IBM 1.3.1-6 JRE.
Thanks! -nicole
At 16:52 on Mar 17, nicole shook the earth with:
The IBM JRE did not appear to catch the signals at all, they get passed right through and kill the application.
Once I have something that tests the signals exclusively, hopefully I can test all three of the JVMs and see what happens.
At 12:13 on Mar 16, Tony Reix shook the earth with:
Hi Nicole,
{ ... { I will be constructing a basic application that just does the signal { handling similar to my application so I can use it to test.
Seems your problem is not easy to understand ... Let us know when you have built such a basic application. At that time we'll try to reproduce it there, probably with the Sun or IBM JVMs. Did you try with IBM JVM ?
Thanks for helping stabilizing NPTL.
------------------------------------------------------------------------
package test; import sun.misc.Signal; import sun.misc.SignalHandler; import java.io.*;
public class SignalTest implements SignalHandler { public SignalTest() { } public static void main(String[] args) { SignalTest st = new SignalTest(); st.run(); }
public void run() { System.out.println("Initializing Signals..."); initSignals(); System.out.println("Signals Initialized."); System.out.println("I'm going to sit here now while you try to kill me" + " (type exit to force quit)");
BufferedReader _input = new BufferedReader(new InputStreamReader(System.in)); String s = "foo";
while(!(s.equals("exit"))) { try { s = _input.readLine(); s = s.trim(); } catch(java.io.IOException e) { System.out.println("oops, I didn't expect that: " + e.toString()); } }
System.out.println("Exiting on user request."); System.exit(0); }
protected void initSignals() { try { System.out.println("Initializing sig INT"); Signal.handle(new Signal("INT"), this); } catch(IllegalArgumentException e) { // failed System.out.println("Signals Caught:" + e.toString()); }
try { System.out.println("Initializing sig HUP"); Signal.handle(new Signal("HUP"), this); } catch(IllegalArgumentException e) { // failed System.out.println("Signals Caught:" + e.toString()); } try { System.out.println("Initializing sig TERM"); Signal.handle(new Signal("TERM"), this); } catch(IllegalArgumentException e) { // failed System.out.println("Signals Caught: " + e.toString()); }
try { System.out.println("Initializing sig USR1"); Signal.handle(new Signal("USR1"), this); } catch(IllegalArgumentException e) { // failed System.out.println("Signals Caught: " + e.toString()); } }
public void handle(Signal sig) { System.out.println("Caught " + sig.toString() + " ("+sig.getNumber()+")"); if(sig.toString().equals("SIGTERM")) { System.out.println("Caught sig TERM, exiting"); System.exit(-1); } } }
---------------------------------------------------------------------- To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]