Hi Dmitry, Thanks for the proposed patch.
> On POSIX systems the GNU make jobserver is implemented as a pipe, > and these two unexpected descriptors make test-execute-child fail. This problem description is a bit technical. It took me a bit of work to translate your description into a "how to reproduce". Namely, $ make -j 8 check produces this output: Test case 14: 0 1 2 3 4 10 test-execute-main.c:295: assertion 'ret == 0' failed Aborted (core dumped) test-execute.sh: test case 14 failed Test case 15: 0 1 2 3 4 10 test-execute-main.c:305: assertion 'ret == 0' failed Aborted (core dumped) test-execute.sh: test case 15 failed Test case 16: 0 1 2 3 4 test-execute-main.c:315: assertion 'ret == 0' failed Aborted (core dumped) test-execute.sh: test case 16 failed Now, there are several questions: 1) Why is GNU make passing these descriptors 3 and 4 to the child process? The Makefile rule looks like this: test-execute.sh.log: test-execute.sh @p='test-execute.sh'; \ b='test-execute.sh'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) and it does not start with '+'. (Cf. [1].) Oh, I see: $(am__check_pre) expands to something that contains $(TESTS_ENVIRONMENT), and $(TESTS_ENVIRONMENT) contains MAKE='$(MAKE)' and that occurrence of $(MAKE) makes 'make' think that the rule may execute a sub-make. 2) You suggest to deal with the file descriptors 3..19. Is this reliable? The MAKEFLAGS variable in the environment is defined as MAKEFLAGS="w -j8 --jobserver-auth=3,4 -- ..." So we could parse this string and look for the --jobserver-auth option. Oh, wait: this option was named differently in older GNU make versions.[2] 3) You suggest to set the cloexec bit on these file descriptors, so that test-execute-child will have them closed. However, it is simpler to just close() them in test-execute-parent already, since test-execute-parent does not need these file descriptors either. 4) How about other environments? I saw 'test-execute.sh' also fail in some recent Linux distro with KDE desktop. Apparently 'plasma' is passing one or two open file descriptors to all children (that is, to all processes running in this desktop environment). Do you think this is worth reporting? 5) Will glibc at some point export the close_range() function [3]? If so, Gnulib should probably provide a substitute close_range(), and test-execute-main.c should better call this function, rather than rolling its own loop. Bruno [1] https://stackoverflow.com/questions/60702726/warning-jobserver-unavailable-using-j1-add-to-parent-make-rule [2] https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=827132 [3] https://lwn.net/Articles/789000/