Newsgroup: it.comp.java
Titolo: intercettare un segnale da S.O.

Ho scritto una classettina che apre una connessione con Oracle e fa un
while (true) per intercettare dei messaggi che provengono da una pipe di
database (una diavoleria di Oracle). Siccome l'ho scritta con zero
risorse a disposizione l'ho fatta molto grezza e l'unico metodo per
interromperla è fare un bel kill -9. Questo però mi lascia una sessione
Oracle aperta. Ora mi chiedo: esiste un modo per intercettare il kill da
codice in modo da chiudere correttamente la sessione JDBC? Oppure,
esiste un altro sistema per inviare segnali o messaggi alla classe da
S.O., segnali o messaggi che poi posso intercettare da codice?
(possibilmente senza doverne scrivere molto altro, sennò mi cazziano)
Ciao e grazie, Cris
-- 
Cristian Veronesi ><((((º> 
http://www.crpa.it
"Ogni limite ha una pazienza" (A. De Curtis)

 (possibilmente senza doverne scrivere molto altro, sennò mi cazziano)
Il JDK 1.3 ha una funzione che viene richiamata in caso di Ctrl-C prima
di terminare la virtual machine. Non so se questa informazione possa
esserti d'aiuto, ma il ctrl-c se non m'inganno è il sigquit.
Ciao,
	Stefano
----------
"X WindowSSS, teSSSoro mio... lo odieremo per SSSempre"
Bill Gollum
----------

 esserti d'aiuto, ma il ctrl-c se non m'inganno è il sigquit.
Purtoppo uso il JDK 1.1, comunque grazie lo stesso.
Ciao, Cris


 Purtoppo uso il JDK 1.1, comunque grazie lo stesso.
 
Allora un trucco molto molto sporco e molto molto sudicio e molto molto
veloce da realizzare potrebbe essere un thread lanciato dalla tua
applicazione che fa:
ServerSocket ss = new ServerSocket(19999);
Socket s = ss.accept();
s.close();
condizione_del_ciclo = false;
così nel tuo programma invece che while(true) fai while
(condizione_del_ciclo).
Un semplice telnet alla porta 19999 farà crollare la tua applicazione,
il computer su cui gira ed il palazzo in cui questo risiede... oddio,
forse no, potrebbe limitarsi a far terminare l'applicazione, ma ti
darebbe il tempo di chiudere la tua sessione con Oracle.
E' solo un'idea :)


 applicazione che fa:
Si, credo che farò così... Non mi sembra poi così sporco: si potrebbe
aprire un inputstream sul socket e farsi un piccolo gestore di comandi.
L'ho già fatto per un'altra applicazione di questo tipo proprio per
evitare di dovere scrivere anche un'applicazione client.
Ciao, Cris
-- 
Cristian Veronesi ><((((º> 
http://www.crpa.it
"The more constraints one imposes, the more one frees oneself
 of the chains that shackle the spirit."  (I. Stravinsky)


Tempo fa su piattaforma Win32 con versione JDK1.1.8 ho avuto un
problema analogo, e l'ho risolto con chiamata JNI al gestore di
segnali CTRL-C; il codice seguente l'ho tratto tempo addietro da un
messaggio di un NG, e rappresenta un buon punto di partenza, anche se
bisogna modificarne la parte C per richiamare i metodi java
desiderati.
Util.h (Generated via javah -jni JavaUtil - the class file) 
-------------------------------------------------------------------------------
/* DO NOT EDIT THIS FILE - it is machine generated */ 
#include <jni.h> 
/* Header for class Util */ 
#ifndef _Included_Util 
#define _Included_Util 
#ifdef __cplusplus 
extern "C" { 
#endif 
/* 
* Class: Util 
* Method: catchCtrlC 
* Signature: ()V 
*/ 
JNIEXPORT void JNICALL Java_Util_catchCtrlC 
(JNIEnv *, jobject); 
#ifdef __cplusplus 
} 
#endif 
#endif 
Util.c 
--------------- 
#include "Util.h" 
#include <signal.h> 
/* Prototypes */ 
void CtrlCHandler(int sig); 
JNIEXPORT void JNICALL Java_Util_catchCtrlC(JNIEnv *env, jobject obj) 
{ 
/* Install signal handler to catch CTRL+C */ 
signal(SIGINT,CtrlCHandler); 
} 
void CtrlCHandler(int sig) 
{ 
printf("I caught CTRL-C!\n"); 
/* Reset to handler otherwise it is reset to the system handler */ 
signal(SIGINT,CtrlCHandler); 
} 
Util.java 
____________ 
import java.awt.*; 
import java.awt.event.*; 
public class Util 
{ 
public native void catchCtrlC(); 
static 
{ 
System.loadLibrary("Util"); 
} 
public static void main(String args[]) 
{ 
Util u = new Util(); 
u.catchCtrlC(); 
MyFrame mf = new MyFrame("Test Application"); 
} 
} 
class MyFrame extends Frame 
{ 
MyFrame(String title) 
{ 
super(title); 
addWindowListener(new WindowAdapter() { 
public void windowClosing(WindowEvent evt) { 
dispose();System.exit(0);}}); 
setSize(200,200); 
setVisible(true); 
} 
} 
Ciao, Max.