@@ -273,6 +273,47 @@ def test_register_at_fork(self):
273
273
"""
274
274
assert_python_ok ('-c' , code )
275
275
276
+ @support .requires_fork ()
277
+ def test_register_at_fork_multiple_runs (self ):
278
+ # if we run fork multiple times, previously registered
279
+ # callbacks should get executed along with newly registered
280
+ code = """if 1:
281
+ import os
282
+
283
+ r, w = os.pipe()
284
+ fin_r, fin_w = os.pipe()
285
+ # register all forkers
286
+ os.register_at_fork(before=lambda: os.write(w, b'A'))
287
+ os.register_at_fork(after_in_parent=lambda: os.write(w, b'B'))
288
+ os.register_at_fork(after_in_child=lambda: os.write(w, b'C'))
289
+
290
+ pid = os.fork()
291
+ if pid == 0:
292
+ # register new forkers
293
+ os.register_at_fork(before=lambda: os.write(w, b'D'))
294
+ os.register_at_fork(after_in_parent=lambda: os.write(w, b'E'))
295
+ os.register_at_fork(after_in_child=lambda: os.write(w, b'F'))
296
+ child_pid = os.fork()
297
+ if child_pid == 0:
298
+ os.close(w)
299
+ os.read(fin_r, 1)
300
+ os._exit(0)
301
+ os.close(w)
302
+ os.read(fin_r, 1)
303
+ os._exit(0)
304
+ else:
305
+ os.close(w)
306
+ try:
307
+ with open(r, "rb") as f:
308
+ data = f.read()
309
+ assert len(data) == 9, data
310
+ # Check before-fork callbacks
311
+ assert data == b'ABCDABECF', data
312
+ finally:
313
+ os.write(fin_w, b'!')
314
+ """
315
+ assert_python_ok ('-c' , code )
316
+
276
317
@unittest .skipUnless (hasattr (posix , 'lockf' ), "test needs posix.lockf()" )
277
318
def test_lockf (self ):
278
319
fd = os .open (os_helper .TESTFN , os .O_WRONLY | os .O_CREAT )
0 commit comments