I recently started learning Python (a long time as a Java programmer here) and am currently in the process of writing some simple server programs. The problem is that for a seemingly similar piece of code, the Java analog responds correctly to a SIGINT( Ctrl+ C) signal , while Python does not. This is visible when a separate thread is used to create a server. The code is as follows:
package pkg;
import java.io.*;
import java.net.*;
public class ServerTest {
public static void main(final String[] args) throws Exception {
final Thread t = new Server();
t.start();
}
}
class Server extends Thread {
@Override
public void run() {
try {
final ServerSocket sock = new ServerSocket(12345);
while(true) {
final Socket clientSock = sock.accept();
clientSock.close();
}
} catch(Exception e) {
e.printStackTrace();
}
}
}
and Python code:
import threading, sys, socket, signal
def startserver():
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('', 12345))
s.listen(1)
while True:
csock, caddr = s.accept()
csock.sendall('Get off my lawn kids...\n')
csock.close()
if __name__ == '__main__':
try:
t = threading.Thread(target=startserver)
t.start()
except:
sys.exit(1)
, TCP . Ctrl + C Java, JVM , Python , , ^C . - Ctrl + Z, .
, ; sighandler, Ctrl + Z ? , :
import threading, sys, socket, signal
def startserver():
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('', 12345))
s.listen(1)
while True:
csock, caddr = s.accept()
csock.sendall('Get off my lawn kids...\n')
csock.close()
def ctrlz_handler(*args, **kwargs):
sys.exit(1)
if __name__ == '__main__':
try:
signal.signal(signal.SIGTSTP, ctrlz_handler)
t = threading.Thread(target=startserver)
t.start()
except:
sys.exit(1)
, , ! Ctrl + C "^ C" Ctrl + Z , '^ Z'.
, : ? , , , , SIGINT? BTW Python 2.6.4 Ubuntu.
,
Sasuke