mirror of
https://github.com/python/cpython.git
synced 2024-12-18 06:14:00 +08:00
bpo-36368: Ignore SIGINT in SharedMemoryManager servers. (GH-12483)
Fix a bug crashing SharedMemoryManager instances in interactive sessions after a Ctrl-C (KeyboardInterrupt) was sent.
This commit is contained in:
parent
86ea58149c
commit
d0d64ad1f5
@ -17,6 +17,7 @@ __all__ = [ 'BaseManager', 'SyncManager', 'BaseProxy', 'Token',
|
|||||||
|
|
||||||
import sys
|
import sys
|
||||||
import threading
|
import threading
|
||||||
|
import signal
|
||||||
import array
|
import array
|
||||||
import queue
|
import queue
|
||||||
import time
|
import time
|
||||||
@ -596,6 +597,9 @@ class BaseManager(object):
|
|||||||
'''
|
'''
|
||||||
Create a server, report its address and run it
|
Create a server, report its address and run it
|
||||||
'''
|
'''
|
||||||
|
# bpo-36368: protect server process from KeyboardInterrupt signals
|
||||||
|
signal.signal(signal.SIGINT, signal.SIG_IGN)
|
||||||
|
|
||||||
if initializer is not None:
|
if initializer is not None:
|
||||||
initializer(*initargs)
|
initializer(*initargs)
|
||||||
|
|
||||||
|
@ -3734,6 +3734,30 @@ class _TestSharedMemory(BaseTestCase):
|
|||||||
|
|
||||||
sms.close()
|
sms.close()
|
||||||
|
|
||||||
|
@unittest.skipIf(os.name != "posix", "not feasible in non-posix platforms")
|
||||||
|
def test_shared_memory_SharedMemoryServer_ignores_sigint(self):
|
||||||
|
# bpo-36368: protect SharedMemoryManager server process from
|
||||||
|
# KeyboardInterrupt signals.
|
||||||
|
smm = multiprocessing.managers.SharedMemoryManager()
|
||||||
|
smm.start()
|
||||||
|
|
||||||
|
# make sure the manager works properly at the beginning
|
||||||
|
sl = smm.ShareableList(range(10))
|
||||||
|
|
||||||
|
# the manager's server should ignore KeyboardInterrupt signals, and
|
||||||
|
# maintain its connection with the current process, and success when
|
||||||
|
# asked to deliver memory segments.
|
||||||
|
os.kill(smm._process.pid, signal.SIGINT)
|
||||||
|
|
||||||
|
sl2 = smm.ShareableList(range(10))
|
||||||
|
|
||||||
|
# test that the custom signal handler registered in the Manager does
|
||||||
|
# not affect signal handling in the parent process.
|
||||||
|
with self.assertRaises(KeyboardInterrupt):
|
||||||
|
os.kill(os.getpid(), signal.SIGINT)
|
||||||
|
|
||||||
|
smm.shutdown()
|
||||||
|
|
||||||
def test_shared_memory_SharedMemoryManager_basics(self):
|
def test_shared_memory_SharedMemoryManager_basics(self):
|
||||||
smm1 = multiprocessing.managers.SharedMemoryManager()
|
smm1 = multiprocessing.managers.SharedMemoryManager()
|
||||||
with self.assertRaises(ValueError):
|
with self.assertRaises(ValueError):
|
||||||
|
@ -0,0 +1,2 @@
|
|||||||
|
Fix a bug crashing SharedMemoryManager instances in interactive sessions after
|
||||||
|
a ctrl-c (KeyboardInterrupt) was sent
|
Loading…
Reference in New Issue
Block a user