# gh-144503: Test that the forkserver can start when the parent process has # a very large sys.argv. Prior to the fix, sys.argv was repr'd into the # forkserver ``-c`` command string which could exceed the OS limit on the # length of a single argv element (MAX_ARG_STRLEN on Linux, ~128 KiB), # causing posix_spawn to fail and the parent to see a BrokenPipeError. import multiprocessing import sys EXPECTED_LEN = 5002 # argv[0] + 5000 padding entries + sentinel def fun(): print(f"worker:{len(sys.argv)}:{sys.argv[-1]}") if __name__ == "__main__": # Inflate sys.argv well past 128 KiB before the forkserver is started. sys.argv[1:] = ["x" * 50] * 5000 + ["sentinel"] assert len(sys.argv) == EXPECTED_LEN ctx = multiprocessing.get_context("forkserver") p = ctx.Process(target=fun) p.start() p.join() sys.exit(p.exitcode) else: # This branch runs when the forkserver preloads this module as # __mp_main__; confirm the large argv was propagated intact. print(f"preload:{len(sys.argv)}:{sys.argv[-1]}")