5
표준 라이브러리를 가지고 놀면서 나는 python2와 python3 사이에 이상한 차이점을 발견했습니다. TCPServer가 다른 스레드에서 실행되는 동안 신호를 잡으려고하면 python2에서 신호를 처리하지 않지만 python3에서는 처리합니다. "^ C"다른 스레드에서 TCPServer가 실행중인 경우 Python 2에서 신호를 처리하지 않습니다.
Starting server thread
Waiting for server thread to shut down
^CKilled
: 여기
이것은 python3로부터 출력import signal
import threading
import sys
if sys.version_info > (3,0):
from socketserver import TCPServer, BaseRequestHandler
else:
from SocketServer import TCPServer, BaseRequestHandler
def shutdown(signum, frame):
print("Shutting down server thread")
server.shutdown()
server = TCPServer(
('127.0.0.1', 7654),
BaseRequestHandler
)
signal.signal(signal.SIGTERM, shutdown)
signal.signal(signal.SIGINT, shutdown)
server_thread = threading.Thread(target=server.serve_forever)
print("Starting server thread")
server_thread.start()
print("Waiting for server thread to shut down")
server_thread.join()
print("Server thread terminated")
문제 재생하는 스크립트이다
Starting server thread
Waiting for server thread to shut down
^CShutting down server thread
Server thread terminated
에게 그리고 이것은 python2 내지 키보드 인터럽트이고 "Killed"는 내가 프로세스로 보낸 sigkill입니다.
왜 종료되지 않았습니까?
이 어떻게 프로세스에 SIG_INT 신호를 보내려면 어떻게합니까? – Tisho
@Tisho POSIX 시스템에서 Control-C는 활성 프로그램이 SIGINT 신호를 받도록합니다. [wiki] (http://en.wikipedia.org/wiki/Control-C#In_command-line_environments) – Blin
적어도 우리는 SIGKILL 신호가 작동한다는 것을 알고 있습니다. SIGKILL을 종료하도록 바인딩하면 작동합니까? – Tisho