CTRL-C behaves differently in Python

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:

// Java code

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:

# 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

+3
2

:

  • . , .

  • , , SIGTSTP. , , , , - .

  • KeyboardInterrupt . . , ^ C , , , , , . , , ; , ( , Java) .

  • KeyboardInterrupt, . , , .

: , KeyboardInterrupt - , KeyboardInterrupt, .


import threading, sys, socket, signal, time

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()

        # Wait forever, so we can receive KeyboardInterrupt.
        while True:
            time.sleep(1)
    except KeyboardInterrupt:
        print "^C received"
        sys.exit(1)

    # We never get here.
    raise RuntimeError, "not reached"
+4
  • , , , , ;

  • , python ;

  • offtop: ;

  • . : stopped while, ( threading.Thread, ), "" ( ) Ctrl + C / Ctrl + Z ; while t.isAlive(): time.sleep(1). :

, sys, , ,

class Server (threading.Thread): def init (self):   threading.Thread. INIT ()   self._stop = False   self._port = 12345

def stop (self):   self.__ stop = True   self.kick()

def kick (self):   :     s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)     s.connect(('', self.__ port))     s.close()    IOError, e:     print " :", e

def run (self):   s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)   s.bind(('', self._port))   s.listen(1)   :      True:       csock, caddr = s.accept()        self._stop:          ", "                print " ", caddr       :         csock.sendall( " ... \n" )        :         csock.close()    :     s.close()

== ' main: t = () # , t.setDaemon(True) t.start() :    t.isAlive():     time.sleep(1) : # Ctrl + C   print " , ?" t.stop() # t.join() , # ,

, , , ,

+1

Source: https://habr.com/ru/post/1772916/


All Articles