Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package gap-io for openSUSE:Factory checked 
in at 2026-09-29 17:49:14
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/gap-io (Old)
 and      /work/SRC/openSUSE:Factory/.gap-io.new.383539 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "gap-io"

Tue Sep 29 17:49:14 2026 rev:9 rq:1381263 version:4.11.0

Changes:
--------
--- /work/SRC/openSUSE:Factory/gap-io/gap-io.changes    2026-07-17 
01:45:47.909938453 +0200
+++ /work/SRC/openSUSE:Factory/.gap-io.new.383539/gap-io.changes        
2026-09-29 17:50:39.995428950 +0200
@@ -1,0 +2,15 @@
+Mon Sep 28 21:55:56 UTC 2026 - Jan Engelhardt <[email protected]>
+
+- Update to release 4.11.0
+  * Reset blocked/ignored/caught termination signals around IO_fork
+    so that children can be stopped with SIGTERM etc. even when a
+    program embedding GAP (e.g. julia via GAP.jl) redirects signal
+    handling.
+  * Made IO_WaitPid return instead of looping forever when the
+    waited-for process is not an unreaped child.
+  * No longer installs a SIGCHLD handler in HPC-GAP or when GAP is
+    embedded in another program (e.g. julia via GAP.jl). Wait only
+    for the children created by IO_fork, by process id, so that the
+    host's own child process handling keeps working.
+
+-------------------------------------------------------------------

Old:
----
  io-4.10.0.tar.gz

New:
----
  io-4.11.0.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ gap-io.spec ++++++
--- /var/tmp/diff_new_pack.CJpG43/_old  2026-09-29 17:50:40.823463527 +0200
+++ /var/tmp/diff_new_pack.CJpG43/_new  2026-09-29 17:50:40.827463694 +0200
@@ -17,7 +17,7 @@
 
 
 Name:           gap-io
-Version:        4.10.0
+Version:        4.11.0
 Release:        0
 Summary:        GAP: Bindings for low level C library IO
 License:        GPL-3.0-or-later

++++++ _scmsync.obsinfo ++++++
--- /var/tmp/diff_new_pack.CJpG43/_old  2026-09-29 17:50:40.876465740 +0200
+++ /var/tmp/diff_new_pack.CJpG43/_new  2026-09-29 17:50:40.879465865 +0200
@@ -1,5 +1,5 @@
-mtime: 1784221401
-commit: fc0b80f54370c481deb25878910723db420e4b0112ca88129997a575e81c1238
+mtime: 1790632598
+commit: 7e9e0ee5adf507d6fc8b0b5ce0bc304a28f7351dc7936870d7dd66b9d9c7efb1
 url: https://src.opensuse.org/jengelh/gap-io
 revision: master
 

++++++ build.specials.obscpio ++++++

++++++ build.specials.obscpio ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/.gitignore new/.gitignore
--- old/.gitignore      1970-01-01 01:00:00.000000000 +0100
+++ new/.gitignore      2026-09-28 23:56:38.000000000 +0200
@@ -0,0 +1 @@
+.osc

++++++ io-4.10.0.tar.gz -> io-4.11.0.tar.gz ++++++
++++ 1682 lines of diff (skipped)
++++    retrying with extended exclude list
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/io-4.10.0/CHANGES new/io-4.11.0/CHANGES
--- old/io-4.10.0/CHANGES       2026-07-14 02:00:00.000000000 +0200
+++ new/io-4.11.0/CHANGES       2026-09-28 02:00:00.000000000 +0200
@@ -1,5 +1,19 @@
 This file describes changes in the IO package.
 
+4.11.0 (2026-09-28)
+  - Build on native Windows (mingw); functions without a Windows
+    equivalent, including sockets, remain unavailable there
+  - Reset blocked/ignored/caught termination signals around IO_fork so that
+    children can be stopped with SIGTERM etc. even when a program embedding
+    GAP (e.g. julia via GAP.jl) redirects signal handling
+  - Make IO_WaitPid return instead of looping forever when the waited-for
+    process is not an unreaped child
+  - Do not install a SIGCHLD handler in HPC-GAP or when GAP is embedded in
+    another program (e.g. julia via GAP.jl); wait only for the children
+    created by IO_fork, by process id, so that the host's own child
+    process handling keeps working (resolves issue #5)
+  - Implement IO_gethostname on Windows
+
 4.10.0 (2026-07-14)
   - Handle chunked HTTP responses without waiting for the server to close the
     connection
@@ -224,7 +238,7 @@
   - Pickling/Unpickling of finite fields
   - Set Host component of HTTP request header by default of the name
     of the server argument in SingleHTTPRequest.
-  - Alexander Konovalov's CheckForUpdates function.
+  - Olexandr Konovalov's CheckForUpdates function.
   - Released revision 289 as 2.1: 26.2.2007
 
 2.0 (2006-12-12)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/io-4.10.0/PackageInfo.g new/io-4.11.0/PackageInfo.g
--- old/io-4.10.0/PackageInfo.g 2026-07-14 02:00:00.000000000 +0200
+++ new/io-4.11.0/PackageInfo.g 2026-09-28 02:00:00.000000000 +0200
@@ -7,8 +7,8 @@
 
 PackageName := "IO",
 Subtitle := "Bindings for low level C library I/O routines",
-Version := "4.10.0",
-Date := "14/07/2026", # dd/mm/yyyy format
+Version := "4.11.0",
+Date := "28/09/2026", # dd/mm/yyyy format
 License := "GPL-3.0-or-later",
 
 ##  Information about authors and maintainers.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/io-4.10.0/TODO new/io-4.11.0/TODO
--- old/io-4.10.0/TODO  2026-07-14 02:00:00.000000000 +0200
+++ new/io-4.11.0/TODO  2026-09-28 02:00:00.000000000 +0200
@@ -26,7 +26,7 @@
     (ev. nur bei "chunked access"???)
     --> www.tagesschau.de z.B.
 
-HTTP/1.1-Konformitaet -> Alexander Konovalovs Tests mit Online int seq site
+HTTP/1.1-Konformitaet -> Olexandr Konovalov's Tests mit Online int seq site
 chunked transfer
 
 Web-Proxy???
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/io-4.10.0/configure.ac new/io-4.11.0/configure.ac
--- old/io-4.10.0/configure.ac  2026-07-14 02:00:00.000000000 +0200
+++ new/io-4.11.0/configure.ac  2026-09-28 02:00:00.000000000 +0200
@@ -27,6 +27,8 @@
     unistd.h
 ])
 
+AC_CHECK_MEMBERS([struct stat.st_blksize, struct stat.st_blocks])
+
 # Checks for library functions.
 AC_FUNC_FORK
 AC_CHECK_FUNCS_ONCE([
@@ -38,6 +40,7 @@
     connect
     dup
     dup2
+    fcntl
     fchmod
     fchown
     fstat
@@ -64,8 +67,10 @@
     mknod
     mkstemp
     opendir
+    pipe
     readdir
     readlink
+    realpath
     recv
     recvfrom
     rename
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/io-4.10.0/doc/IO.tex new/io-4.11.0/doc/IO.tex
--- old/io-4.10.0/doc/IO.tex    2026-07-14 02:00:00.000000000 +0200
+++ new/io-4.11.0/doc/IO.tex    2026-09-28 02:00:00.000000000 +0200
@@ -100,8 +100,8 @@
 \mbox{}}}\\
 \vfill
 
-{\Huge  4.10.0 \mbox{}}\\[1cm]
-{ 14 July 2026 \mbox{}}\\[1cm]
+{\Huge  4.11.0 \mbox{}}\\[1cm]
+{ 28 September 2026 \mbox{}}\\[1cm]
 \mbox{}\\[2cm]
 {\Large \textbf{\strut  Max Neunh{\"o}ffer   \strut\mbox{}}}\\
 \hypersetup{pdfauthor={ Max Neunh{\"o}ffer  }}
@@ -547,7 +547,11 @@
 
 
 
- Forks off a child process, which is an identical copy. For details see 
``\texttt{man 2 fork}''. Note that \texttt{IO{\textunderscore}fork} activates 
our SIGCHLD handler (see \texttt{IO{\textunderscore}InstallSIGCHLDHandler} 
(\ref{IOuScoreInstallSIGCHLDHandler})). Note that you must use the 
\texttt{IO{\textunderscore}WaitPid} (\ref{IOuScoreWaitPid}) function to wait or 
check for the termination of child processes, or call 
\texttt{IO{\textunderscore}IgnorePid} (\ref{IOuScoreIgnorePid}) to ignore the 
child. }
+ Forks off a child process, which is an identical copy. For details see 
``\texttt{man 2 fork}''. Note that \texttt{IO{\textunderscore}fork} activates 
our SIGCHLD handler (see \texttt{IO{\textunderscore}InstallSIGCHLDHandler} 
(\ref{IOuScoreInstallSIGCHLDHandler})). Note that you must use the 
\texttt{IO{\textunderscore}WaitPid} (\ref{IOuScoreWaitPid}) function to wait or 
check for the termination of child processes, or call 
\texttt{IO{\textunderscore}IgnorePid} (\ref{IOuScoreIgnorePid}) to ignore the 
child. 
+
+ The child starts with the signal mask and the dispositions of the termination
+signals (SIGHUP, SIGINT, SIGQUIT, SIGALRM, SIGTERM) reset to their defaults,
+even if the process embedding \textsf{GAP} had blocked or ignored them, so 
that it can be stopped with \texttt{IO{\textunderscore}kill} 
(\ref{IOuScorekill}). }
 
  
 
@@ -1360,7 +1364,11 @@
 calling it twice does exactly the same as calling it once. It returns 
\texttt{true} when it is called for the first time since then a pointer to the 
old signal
 handler is stored in a global variable. This function is automatically called
 by any function which creates new processes, so never needs to be called
-unless the handler was explictly disabled with 
\texttt{IO{\textunderscore}RestoreSIGCHLDHandler} 
(\ref{IOuScoreRestoreSIGCHLDHandler}) See \texttt{IO{\textunderscore}fork} 
(\ref{IOuScorefork}). }
+unless the handler was explictly disabled with 
\texttt{IO{\textunderscore}RestoreSIGCHLDHandler} 
(\ref{IOuScoreRestoreSIGCHLDHandler}) See \texttt{IO{\textunderscore}fork} 
(\ref{IOuScorefork}). 
+
+ In HPC\texttt{\symbol{45}}GAP, and when \textsf{GAP} is used as a library 
inside another program (such as Julia via GAP.jl), no
+SIGCHLD handler is installed at all, and this function returns \texttt{false}: 
the host manages child processes itself, and \textsf{IO} only ever waits for 
the children it created, by process id. All functions
+described here behave the same in both modes. }
 
  
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/io-4.10.0/doc/_entities.xml new/io-4.11.0/doc/_entities.xml
--- old/io-4.10.0/doc/_entities.xml     2026-07-14 02:00:00.000000000 +0200
+++ new/io-4.11.0/doc/_entities.xml     2026-09-28 02:00:00.000000000 +0200
@@ -1,4 +1,4 @@
 <!ENTITY IO '<Package>IO</Package>'>
-<!ENTITY RELEASEDATE '14 July 2026'>
+<!ENTITY RELEASEDATE '28 September 2026'>
 <!ENTITY RELEASEYEAR '2026'>
-<!ENTITY VERSION '4.10.0'>
+<!ENTITY VERSION '4.11.0'>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/io-4.10.0/doc/chap0.html new/io-4.11.0/doc/chap0.html
--- old/io-4.10.0/doc/chap0.html        2026-07-14 02:00:00.000000000 +0200
+++ new/io-4.11.0/doc/chap0.html        2026-09-28 02:00:00.000000000 +0200
@@ -29,10 +29,10 @@
 <h2>Bindings for low level C library I/O routines</h2>
 
 <p>
-    4.10.0</p>
+    4.11.0</p>
 
 <p>
-    14 July 2026
+    28 September 2026
   </p>
 
 </div>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/io-4.10.0/doc/chap0.txt new/io-4.11.0/doc/chap0.txt
--- old/io-4.10.0/doc/chap0.txt 2026-07-14 02:00:00.000000000 +0200
+++ new/io-4.11.0/doc/chap0.txt 2026-09-28 02:00:00.000000000 +0200
@@ -6,10 +6,10 @@
                  Bindings for low level C library I/O routines 
   
   
-                                     4.10.0
+                                     4.11.0
   
   
-                                  14 July 2026
+                               28 September 2026
   
   
                                  Max Neunhöffer
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/io-4.10.0/doc/chap0_mj.html new/io-4.11.0/doc/chap0_mj.html
--- old/io-4.10.0/doc/chap0_mj.html     2026-07-14 02:00:00.000000000 +0200
+++ new/io-4.11.0/doc/chap0_mj.html     2026-09-28 02:00:00.000000000 +0200
@@ -32,10 +32,10 @@
 <h2>Bindings for low level C library I/O routines</h2>
 
 <p>
-    4.10.0</p>
+    4.11.0</p>
 
 <p>
-    14 July 2026
+    28 September 2026
   </p>
 
 </div>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/io-4.10.0/doc/chap3.html new/io-4.11.0/doc/chap3.html
--- old/io-4.10.0/doc/chap3.html        2026-07-14 02:00:00.000000000 +0200
+++ new/io-4.11.0/doc/chap3.html        2026-09-28 02:00:00.000000000 +0200
@@ -328,6 +328,8 @@
 
 <p>Forks off a child process, which is an identical copy. For details see 
<q><code class="code">man 2 fork</code></q>. Note that <code 
class="func">IO_fork</code> activates our SIGCHLD handler (see <code 
class="func">IO_InstallSIGCHLDHandler</code> (<a 
href="chap3.html#X8383E62D86BE30C6"><span class="RefLink">3.3-3</span></a>)). 
Note that you must use the <code class="func">IO_WaitPid</code> (<a 
href="chap3.html#X80737A008450184F"><span class="RefLink">3.2-66</span></a>) 
function to wait or check for the termination of child processes, or call <code 
class="func">IO_IgnorePid</code> (<a href="chap3.html#X84295FC77CCB1066"><span 
class="RefLink">3.2-67</span></a>) to ignore the child.</p>
 
+<p>The child starts with the signal mask and the dispositions of the 
termination signals (SIGHUP, SIGINT, SIGQUIT, SIGALRM, SIGTERM) reset to their 
defaults, even if the process embedding <strong class="pkg">GAP</strong> had 
blocked or ignored them, so that it can be stopped with <code 
class="func">IO_kill</code> (<a href="chap3.html#X7D0439128512FBF6"><span 
class="RefLink">3.2-31</span></a>).</p>
+
 <p><a id="X7E27748983EC7B5C" name="X7E27748983EC7B5C"></a></p>
 
 <h5>3.2-20 IO_fstat</h5>
@@ -806,6 +808,8 @@
 
 <p>Installs our SIGCHLD handler. This functions works as an idempotent. That 
is, calling it twice does exactly the same as calling it once. It returns <code 
class="keyw">true</code> when it is called for the first time since then a 
pointer to the old signal handler is stored in a global variable. This function 
is automatically called by any function which creates new processes, so never 
needs to be called unless the handler was explictly disabled with <code 
class="func">IO_RestoreSIGCHLDHandler</code> (<a 
href="chap3.html#X7EEB7471816B64DF"><span class="RefLink">3.3-4</span></a>) See 
<code class="func">IO_fork</code> (<a href="chap3.html#X86C819F37D07ECF7"><span 
class="RefLink">3.2-19</span></a>).</p>
 
+<p>In HPC-GAP, and when <strong class="pkg">GAP</strong> is used as a library 
inside another program (such as Julia via GAP.jl), no SIGCHLD handler is 
installed at all, and this function returns <code class="keyw">false</code>: 
the host manages child processes itself, and <strong class="pkg">IO</strong> 
only ever waits for the children it created, by process id. All functions 
described here behave the same in both modes.</p>
+
 <p><a id="X7EEB7471816B64DF" name="X7EEB7471816B64DF"></a></p>
 
 <h5>3.3-4 IO_RestoreSIGCHLDHandler</h5>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/io-4.10.0/doc/chap3.txt new/io-4.11.0/doc/chap3.txt
--- old/io-4.10.0/doc/chap3.txt 2026-07-14 02:00:00.000000000 +0200
+++ new/io-4.11.0/doc/chap3.txt 2026-09-28 02:00:00.000000000 +0200
@@ -254,6 +254,11 @@
   (3.2-66)  function  to wait or check for the termination of child 
processes,
   or call IO_IgnorePid (3.2-67) to ignore the child.
   
+  The  child  starts  with  the  signal  mask  and  the  
dispositions  of  the
+  termination  signals  (SIGHUP,  SIGINT,  SIGQUIT, SIGALRM, SIGTERM) reset to
+  their  defaults,  even  if  the process embedding GAP had blocked 
or ignored
+  them, so that it can be stopped with IO_kill 
(3.2-31).
+  
   3.2-20 IO_fstat
   
   IO_fstat( fd )  function
@@ -719,6 +724,12 @@
   needs   to  be  called  unless  the  handler  was  explictly  disabled  with
   IO_RestoreSIGCHLDHandler (3.3-4) See IO_fork 
(3.2-19).
   
+  In  HPC-GAP,  and when GAP is used as a library inside 
another program (such
+  as  Julia  via  GAP.jl),  no  SIGCHLD  handler is installed at all, and this
+  function returns false: the host manages child processes itself, 
and IO only
+  ever  waits  for  the  children  it  created,  by  process id. All functions
+  described here behave the same in both modes.
+  
   3.3-4 IO_RestoreSIGCHLDHandler
   
   IO_RestoreSIGCHLDHandler(  )  function
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/io-4.10.0/doc/chap3_mj.html new/io-4.11.0/doc/chap3_mj.html
--- old/io-4.10.0/doc/chap3_mj.html     2026-07-14 02:00:00.000000000 +0200
+++ new/io-4.11.0/doc/chap3_mj.html     2026-09-28 02:00:00.000000000 +0200
@@ -331,6 +331,8 @@
 
 <p>Forks off a child process, which is an identical copy. For details see 
<q><code class="code">man 2 fork</code></q>. Note that <code 
class="func">IO_fork</code> activates our SIGCHLD handler (see <code 
class="func">IO_InstallSIGCHLDHandler</code> (<a 
href="chap3_mj.html#X8383E62D86BE30C6"><span 
class="RefLink">3.3-3</span></a>)). Note that you must use the <code 
class="func">IO_WaitPid</code> (<a href="chap3_mj.html#X80737A008450184F"><span 
class="RefLink">3.2-66</span></a>) function to wait or check for the 
termination of child processes, or call <code class="func">IO_IgnorePid</code> 
(<a href="chap3_mj.html#X84295FC77CCB1066"><span 
class="RefLink">3.2-67</span></a>) to ignore the child.</p>
 
+<p>The child starts with the signal mask and the dispositions of the 
termination signals (SIGHUP, SIGINT, SIGQUIT, SIGALRM, SIGTERM) reset to their 
defaults, even if the process embedding <strong class="pkg">GAP</strong> had 
blocked or ignored them, so that it can be stopped with <code 
class="func">IO_kill</code> (<a href="chap3_mj.html#X7D0439128512FBF6"><span 
class="RefLink">3.2-31</span></a>).</p>
+
 <p><a id="X7E27748983EC7B5C" name="X7E27748983EC7B5C"></a></p>
 
 <h5>3.2-20 IO_fstat</h5>
@@ -809,6 +811,8 @@
 
 <p>Installs our SIGCHLD handler. This functions works as an idempotent. That 
is, calling it twice does exactly the same as calling it once. It returns <code 
class="keyw">true</code> when it is called for the first time since then a 
pointer to the old signal handler is stored in a global variable. This function 
is automatically called by any function which creates new processes, so never 
needs to be called unless the handler was explictly disabled with <code 
class="func">IO_RestoreSIGCHLDHandler</code> (<a 
href="chap3_mj.html#X7EEB7471816B64DF"><span class="RefLink">3.3-4</span></a>) 
See <code class="func">IO_fork</code> (<a 
href="chap3_mj.html#X86C819F37D07ECF7"><span 
class="RefLink">3.2-19</span></a>).</p>
 
+<p>In HPC-GAP, and when <strong class="pkg">GAP</strong> is used as a library 
inside another program (such as Julia via GAP.jl), no SIGCHLD handler is 
installed at all, and this function returns <code class="keyw">false</code>: 
the host manages child processes itself, and <strong class="pkg">IO</strong> 
only ever waits for the children it created, by process id. All functions 
described here behave the same in both modes.</p>
+
 <p><a id="X7EEB7471816B64DF" name="X7EEB7471816B64DF"></a></p>
 
 <h5>3.3-4 IO_RestoreSIGCHLDHandler</h5>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/io-4.10.0/doc/main.xml new/io-4.11.0/doc/main.xml
--- old/io-4.10.0/doc/main.xml  2026-07-14 02:00:00.000000000 +0200
+++ new/io-4.11.0/doc/main.xml  2026-09-28 02:00:00.000000000 +0200
@@ -479,7 +479,12 @@
 Note that <Ref Func="IO_fork"/> activates our SIGCHLD handler (see <Ref
 Func="IO_InstallSIGCHLDHandler"/>). Note that you must use the
 <Ref Func="IO_WaitPid"/> function to wait or check for the termination of
-child processes, or call <Ref Func="IO_IgnorePid"/> to ignore the child. 
+child processes, or call <Ref Func="IO_IgnorePid"/> to ignore the child.
+<P/>
+The child starts with the signal mask and the dispositions of the
+termination signals (SIGHUP, SIGINT, SIGQUIT, SIGALRM, SIGTERM) reset to
+their defaults, even if the process embedding &GAP; had blocked or ignored
+them, so that it can be stopped with <Ref Func="IO_kill"/>.
 </Description>
 </ManSection>
 
@@ -1096,6 +1101,12 @@
 so never needs to be called unless the handler was explictly disabled with
 <Ref Func="IO_RestoreSIGCHLDHandler"/>
 See <Ref Func="IO_fork"/>.
+<P/>
+In HPC-GAP, and when &GAP; is used as a library inside another program
+(such as Julia via GAP.jl), no SIGCHLD handler is installed at all, and this
+function returns <K>false</K>: the host manages child processes itself, and
+<Package>IO</Package> only ever waits for the children it created, by process 
id. All
+functions described here behave the same in both modes.
 </Description>
 </ManSection>
 
Binary files old/io-4.10.0/doc/manual.pdf and new/io-4.11.0/doc/manual.pdf 
differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/io-4.10.0/doc/manual.six new/io-4.11.0/doc/manual.six
--- old/io-4.10.0/doc/manual.six        2026-07-14 02:00:00.000000000 +0200
+++ new/io-4.11.0/doc/manual.six        2026-09-28 02:00:00.000000000 +0200
@@ -32,93 +32,93 @@
 1X", "3.2", [ 3, 2, 0 ], 95, 9, "the low-level functions in detail", 
       "X800F9F3E810A7228" ], 
   [ "\033[1X\033[33X\033[0;-2YFurther C level functions\033[133X\033[101X", 
-      "3.3", [ 3, 3, 0 ], 684, 20, "further c level functions", 
+      "3.3", [ 3, 3, 0 ], 689, 20, "further c level functions", 
       "X85065AD381BD8E0F" ], 
   [ 
       "\033[1X\033[33X\033[0;-2YHigh level functions for buffered 
I/O\033[133X\\
-033[101X", "4", [ 4, 0, 0 ], 1, 21, "high level functions for buffered i/o", 
+033[101X", "4", [ 4, 0, 0 ], 1, 22, "high level functions for buffered i/o", 
       "X7D6A3F7178CB6169" ], 
   [ 
       "\033[1X\033[33X\033[0;-2YTypes and the creation of 
\033[10XFile\033[110X\\
 033[101X\027\033[1X\027 objects\033[133X\033[101X", "4.1", [ 4, 1, 0 ], 29, 
-      21, "types and the creation of file objects", "X83C42F7778B704C7" ], 
+      22, "types and the creation of file objects", "X83C42F7778B704C7" ], 
   [ "\033[1X\033[33X\033[0;-2YReading and writing\033[133X\033[101X", "4.2", 
-      [ 4, 2, 0 ], 91, 22, "reading and writing", "X818FA8A37C8BBB95" ], 
+      [ 4, 2, 0 ], 91, 23, "reading and writing", "X818FA8A37C8BBB95" ], 
   [ "\033[1X\033[33X\033[0;-2YOther functions\033[133X\033[101X", "4.3", 
-      [ 4, 3, 0 ], 326, 26, "other functions", "X87C3D1B984960984" ], 
+      [ 4, 3, 0 ], 326, 27, "other functions", "X87C3D1B984960984" ], 
   [ "\033[1X\033[33X\033[0;-2YInter process communication\033[133X\033[101X", 
-      "4.4", [ 4, 4, 0 ], 429, 28, "inter process communication", 
+      "4.4", [ 4, 4, 0 ], 429, 29, "inter process communication", 
       "X85BB2BA684485CD6" ], 
   [ 
       "\033[1X\033[33X\033[0;-2YObject serialisation 
(Pickling)\033[133X\033[101X\
-", "5", [ 5, 0, 0 ], 1, 33, "object serialisation pickling", 
+", "5", [ 5, 0, 0 ], 1, 34, "object serialisation pickling", 
       "X81BBA46880EBFC7D" ], 
   [ "\033[1X\033[33X\033[0;-2YResult objects\033[133X\033[101X", "5.1", 
-      [ 5, 1, 0 ], 18, 33, "result objects", "X7E504814811605B7" ], 
+      [ 5, 1, 0 ], 18, 34, "result objects", "X7E504814811605B7" ], 
   [ "\033[1X\033[33X\033[0;-2YPickling and unpickling\033[133X\033[101X", 
-      "5.2", [ 5, 2, 0 ], 47, 34, "pickling and unpickling", 
+      "5.2", [ 5, 2, 0 ], 47, 35, "pickling and unpickling", 
       "X7F68A8F47F87B243" ], 
   [ 
       "\033[1X\033[33X\033[0;-2YExtending the pickling 
framework\033[133X\033[101\
-X", "5.3", [ 5, 3, 0 ], 99, 34, "extending the pickling framework", 
+X", "5.3", [ 5, 3, 0 ], 99, 35, "extending the pickling framework", 
       "X7B1C9A9C7D3C0312" ], 
   [ "\033[1X\033[33X\033[0;-2YReally random sources\033[133X\033[101X", "6", 
-      [ 6, 0, 0 ], 1, 36, "really random sources", "X78A8811F7BD55ABA" ], 
+      [ 6, 0, 0 ], 1, 37, "really random sources", "X78A8811F7BD55ABA" ], 
   [ "\033[1X\033[33X\033[0;-2YThe functions\033[133X\033[101X", "6.1", 
-      [ 6, 1, 0 ], 11, 36, "the functions", "X8173135A7D187358" ], 
+      [ 6, 1, 0 ], 11, 37, "the functions", "X8173135A7D187358" ], 
   [ 
       "\033[1X\033[33X\033[0;-2YA client side implementation of the HTTP 
protocol\
-\033[133X\033[101X", "7", [ 7, 0, 0 ], 1, 37, 
+\033[133X\033[101X", "7", [ 7, 0, 0 ], 1, 38, 
       "a client side implementation of the http protocol", 
       "X79DA05BB7CCC1749" ], 
   [ 
       "\033[1X\033[33X\033[0;-2YFunctions for client side 
HTTP\033[133X\033[101X"
-        , "7.1", [ 7, 1, 0 ], 9, 37, "functions for client side http", 
+        , "7.1", [ 7, 1, 0 ], 9, 38, "functions for client side http", 
       "X7E8B5F0A87F2C1F7" ], 
   [ "\033[1X\033[33X\033[0;-2YBackground jobs using fork\033[133X\033[101X", 
-      "8", [ 8, 0, 0 ], 1, 40, "background jobs using fork", 
+      "8", [ 8, 0, 0 ], 1, 41, "background jobs using fork", 
       "X7E9E9B3F7B585BA7" ], 
   [ "\033[1X\033[33X\033[0;-2YBackground jobs\033[133X\033[101X", "8.1", 
-      [ 8, 1, 0 ], 28, 40, "background jobs", "X7CCAF66D7E7E098E" ], 
+      [ 8, 1, 0 ], 28, 41, "background jobs", "X7CCAF66D7E7E098E" ], 
   [ 
       "\033[1X\033[33X\033[0;-2YParallel programming 
skeletons\033[133X\033[101X"
-        , "8.2", [ 8, 2, 0 ], 138, 42, "parallel programming skeletons", 
+        , "8.2", [ 8, 2, 0 ], 138, 43, "parallel programming skeletons", 
       "X7AF7D78B7F6F1212" ], 
   [ "\033[1X\033[33X\033[0;-2YWorker farms\033[133X\033[101X", "8.3", 
-      [ 8, 3, 0 ], 276, 44, "worker farms", "X7D18519B879047B3" ], 
+      [ 8, 3, 0 ], 276, 45, "worker farms", "X7D18519B879047B3" ], 
   [ "\033[1X\033[33X\033[0;-2YI/O multiplexing\033[133X\033[101X", "9", 
-      [ 9, 0, 0 ], 1, 47, "i/o multiplexing", "X7A466B907B882CA0" ], 
+      [ 9, 0, 0 ], 1, 48, "i/o multiplexing", "X7A466B907B882CA0" ], 
   [ "\033[1X\033[33X\033[0;-2YIntroduction\033[133X\033[101X", "9.1", 
-      [ 9, 1, 0 ], 4, 47, "introduction", "X7DFB63A97E67C0A1" ], 
+      [ 9, 1, 0 ], 4, 48, "introduction", "X7DFB63A97E67C0A1" ], 
   [ 
       "\033[1X\033[33X\033[0;-2YThe operations for 
\033[10XIOHub\033[110X\033[101\
-X\027\033[1X\027 objects\033[133X\033[101X", "9.2", [ 9, 2, 0 ], 22, 47, 
+X\027\033[1X\027 objects\033[133X\033[101X", "9.2", [ 9, 2, 0 ], 22, 48, 
       "the operations for iohub objects", "X81EC9A3186F1DCDE" ], 
   [ "\033[1X\033[33X\033[0;-2YExamples\033[133X\033[101X", "9.3", 
-      [ 9, 3, 0 ], 194, 50, "examples", "X7A489A5D79DA9E5C" ], 
+      [ 9, 3, 0 ], 194, 51, "examples", "X7A489A5D79DA9E5C" ], 
   [ "\033[1X\033[33X\033[0;-2YExamples of usage\033[133X\033[101X", "10", 
-      [ 10, 0, 0 ], 1, 51, "examples of usage", "X7EADF566874177D8" ], 
+      [ 10, 0, 0 ], 1, 52, "examples of usage", "X7EADF566874177D8" ], 
   [ "\033[1X\033[33X\033[0;-2YWriting and reading a file\033[133X\033[101X", 
-      "10.1", [ 10, 1, 0 ], 18, 51, "writing and reading a file", 
+      "10.1", [ 10, 1, 0 ], 18, 52, "writing and reading a file", 
       "X7EC25CA68794860A" ], 
   [ 
       "\033[1X\033[33X\033[0;-2YUsing filtering programs to read and write 
files\\
-033[133X\033[101X", "10.2", [ 10, 2, 0 ], 69, 52, 
+033[133X\033[101X", "10.2", [ 10, 2, 0 ], 69, 53, 
       "using filtering programs to read and write files", "X7AECE665813D6E4D" 
      ], 
   [ 
       "\033[1X\033[33X\033[0;-2YUsing filters when reading or writing files 
seque\
-ntially\033[133X\033[101X", "10.3", [ 10, 3, 0 ], 93, 52, 
+ntially\033[133X\033[101X", "10.3", [ 10, 3, 0 ], 93, 53, 
       "using filters when reading or writing files sequentially", 
       "X7A8A180D7B335151" ], 
   [ "\033[1X\033[33X\033[0;-2YAccessing a web page\033[133X\033[101X", 
-      "10.4", [ 10, 4, 0 ], 121, 53, "accessing a web page", 
+      "10.4", [ 10, 4, 0 ], 121, 54, "accessing a web page", 
       "X7BD2BF7F87573C69" ], 
   [ "\033[1X\033[33X\033[0;-2Y(Un-)Pickling\033[133X\033[101X", "10.5", 
-      [ 10, 5, 0 ], 149, 53, "un- pickling", "X81BD8400832EE20B" ], 
+      [ 10, 5, 0 ], 149, 54, "un- pickling", "X81BD8400832EE20B" ], 
   [ "\033[1X\033[33X\033[0;-2YLicense\033[133X\033[101X", "11", [ 11, 0, 0 ], 
-      1, 55, "license", "X861E5DF986F89AE2" ], 
-  [ "Index", "ind", [ "Ind", 0, 0 ], 1, 56, "index", "X83A0356F839C696F" ], 
+      1, 56, "license", "X861E5DF986F89AE2" ], 
+  [ "Index", "ind", [ "Ind", 0, 0 ], 1, 57, "index", "X83A0356F839C696F" ], 
   [ "\033[5XIO\033[105X", "1.0", [ 1, 0, 0 ], 1, 5, "io", "X874E1D45845007FE" 
      ], 
   [ "\033[2XIO_accept\033[102X", "3.2-1", [ 3, 2, 1 ], 104, 9, "io_accept", 
@@ -159,288 +159,288 @@
       "X7870647E866D29A4" ], 
   [ "\033[2XIO_fork\033[102X", "3.2-19", [ 3, 2, 19 ], 246, 12, "io_fork", 
       "X86C819F37D07ECF7" ], 
-  [ "\033[2XIO_fstat\033[102X", "3.2-20", [ 3, 2, 20 ], 257, 12, "io_fstat", 
+  [ "\033[2XIO_fstat\033[102X", "3.2-20", [ 3, 2, 20 ], 262, 12, "io_fstat", 
       "X7E27748983EC7B5C" ], 
-  [ "\033[2XIO_getcwd\033[102X", "3.2-21", [ 3, 2, 21 ], 265, 12, 
+  [ "\033[2XIO_getcwd\033[102X", "3.2-21", [ 3, 2, 21 ], 270, 12, 
       "io_getcwd", "X826D86AF8013F184" ], 
-  [ "\033[2XIO_getenv\033[102X", "3.2-22", [ 3, 2, 22 ], 272, 12, 
+  [ "\033[2XIO_getenv\033[102X", "3.2-22", [ 3, 2, 22 ], 277, 12, 
       "io_getenv", "X84AECCE17832D6D8" ], 
-  [ "\033[2XIO_gethostbyname\033[102X", "3.2-23", [ 3, 2, 23 ], 281, 13, 
+  [ "\033[2XIO_gethostbyname\033[102X", "3.2-23", [ 3, 2, 23 ], 286, 13, 
       "io_gethostbyname", "X7DD25BDC79EE65AD" ], 
-  [ "\033[2XIO_gethostname\033[102X", "3.2-24", [ 3, 2, 24 ], 289, 13, 
+  [ "\033[2XIO_gethostname\033[102X", "3.2-24", [ 3, 2, 24 ], 294, 13, 
       "io_gethostname", "X7B7164EF8307D26B" ], 
-  [ "\033[2XIO_getpid\033[102X", "3.2-25", [ 3, 2, 25 ], 296, 13, 
+  [ "\033[2XIO_getpid\033[102X", "3.2-25", [ 3, 2, 25 ], 301, 13, 
       "io_getpid", "X7ECF948083E38BD0" ], 
-  [ "\033[2XIO_getppid\033[102X", "3.2-26", [ 3, 2, 26 ], 304, 13, 
+  [ "\033[2XIO_getppid\033[102X", "3.2-26", [ 3, 2, 26 ], 309, 13, 
       "io_getppid", "X7EC6ABAB7AB9F40F" ], 
-  [ "\033[2XIO_getsockname\033[102X", "3.2-27", [ 3, 2, 27 ], 312, 13, 
+  [ "\033[2XIO_getsockname\033[102X", "3.2-27", [ 3, 2, 27 ], 317, 13, 
       "io_getsockname", "X877A161482FC1769" ], 
-  [ "\033[2XIO_getsockopt\033[102X", "3.2-28", [ 3, 2, 28 ], 319, 13, 
+  [ "\033[2XIO_getsockopt\033[102X", "3.2-28", [ 3, 2, 28 ], 324, 13, 
       "io_getsockopt", "X790213D885BAB495" ], 
-  [ "\033[2XIO_gettimeofday\033[102X", "3.2-29", [ 3, 2, 29 ], 328, 13, 
+  [ "\033[2XIO_gettimeofday\033[102X", "3.2-29", [ 3, 2, 29 ], 333, 13, 
       "io_gettimeofday", "X7BC965198011083B" ], 
-  [ "\033[2XIO_gmtime\033[102X", "3.2-30", [ 3, 2, 30 ], 337, 14, 
+  [ "\033[2XIO_gmtime\033[102X", "3.2-30", [ 3, 2, 30 ], 342, 14, 
       "io_gmtime", "X7DC156EA86F3F356" ], 
-  [ "\033[2XIO_kill\033[102X", "3.2-31", [ 3, 2, 31 ], 346, 14, "io_kill", 
+  [ "\033[2XIO_kill\033[102X", "3.2-31", [ 3, 2, 31 ], 351, 14, "io_kill", 
       "X7D0439128512FBF6" ], 
-  [ "\033[2XIO_lchown\033[102X", "3.2-32", [ 3, 2, 32 ], 355, 14, 
+  [ "\033[2XIO_lchown\033[102X", "3.2-32", [ 3, 2, 32 ], 360, 14, 
       "io_lchown", "X8305F97C87FE448E" ], 
-  [ "\033[2XIO_link\033[102X", "3.2-33", [ 3, 2, 33 ], 363, 14, "io_link", 
+  [ "\033[2XIO_link\033[102X", "3.2-33", [ 3, 2, 33 ], 368, 14, "io_link", 
       "X7E1C65EB84497185" ], 
-  [ "\033[2XIO_listen\033[102X", "3.2-34", [ 3, 2, 34 ], 370, 14, 
+  [ "\033[2XIO_listen\033[102X", "3.2-34", [ 3, 2, 34 ], 375, 14, 
       "io_listen", "X7957063B807025C7" ], 
-  [ "\033[2XIO_localtime\033[102X", "3.2-35", [ 3, 2, 35 ], 377, 14, 
+  [ "\033[2XIO_localtime\033[102X", "3.2-35", [ 3, 2, 35 ], 382, 14, 
       "io_localtime", "X7B7D3D64805F335F" ], 
-  [ "\033[2XIO_lseek\033[102X", "3.2-36", [ 3, 2, 36 ], 386, 14, "io_lseek", 
+  [ "\033[2XIO_lseek\033[102X", "3.2-36", [ 3, 2, 36 ], 391, 14, "io_lseek", 
       "X85C475187C824830" ], 
-  [ "\033[2XIO_lstat\033[102X", "3.2-37", [ 3, 2, 37 ], 393, 15, "io_lstat", 
+  [ "\033[2XIO_lstat\033[102X", "3.2-37", [ 3, 2, 37 ], 398, 15, "io_lstat", 
       "X7A8C75038517A55A" ], 
-  [ "\033[2XIO_mkdir\033[102X", "3.2-38", [ 3, 2, 38 ], 402, 15, "io_mkdir", 
+  [ "\033[2XIO_mkdir\033[102X", "3.2-38", [ 3, 2, 38 ], 407, 15, "io_mkdir", 
       "X83D968AB84F00ABF" ], 
-  [ "\033[2XIO_mkfifo\033[102X", "3.2-39", [ 3, 2, 39 ], 409, 15, 
+  [ "\033[2XIO_mkfifo\033[102X", "3.2-39", [ 3, 2, 39 ], 414, 15, 
       "io_mkfifo", "X80BFF17A8099815F" ], 
-  [ "\033[2XIO_mknod\033[102X", "3.2-40", [ 3, 2, 40 ], 416, 15, "io_mknod", 
+  [ "\033[2XIO_mknod\033[102X", "3.2-40", [ 3, 2, 40 ], 421, 15, "io_mknod", 
       "X7928F1DB8379F850" ], 
-  [ "\033[2XIO_mkstemp\033[102X", "3.2-41", [ 3, 2, 41 ], 423, 15, 
+  [ "\033[2XIO_mkstemp\033[102X", "3.2-41", [ 3, 2, 41 ], 428, 15, 
       "io_mkstemp", "X82B09BF27D5AA458" ], 
-  [ "\033[2XIO_mkdtemp\033[102X", "3.2-42", [ 3, 2, 42 ], 430, 15, 
+  [ "\033[2XIO_mkdtemp\033[102X", "3.2-42", [ 3, 2, 42 ], 435, 15, 
       "io_mkdtemp", "X7F9C9F4B7CB7977A" ], 
-  [ "\033[2XIO_open\033[102X", "3.2-43", [ 3, 2, 43 ], 437, 15, "io_open", 
+  [ "\033[2XIO_open\033[102X", "3.2-43", [ 3, 2, 43 ], 442, 15, "io_open", 
       "X8731A44E8032D9D2" ], 
-  [ "\033[2XIO_opendir\033[102X", "3.2-44", [ 3, 2, 44 ], 445, 16, 
+  [ "\033[2XIO_opendir\033[102X", "3.2-44", [ 3, 2, 44 ], 450, 16, 
       "io_opendir", "X78E234797EB01883" ], 
-  [ "\033[2XIO_pipe\033[102X", "3.2-45", [ 3, 2, 45 ], 454, 16, "io_pipe", 
+  [ "\033[2XIO_pipe\033[102X", "3.2-45", [ 3, 2, 45 ], 459, 16, "io_pipe", 
       "X7C8F0A44837BBE8C" ], 
-  [ "\033[2XIO_read\033[102X", "3.2-46", [ 3, 2, 46 ], 464, 16, "io_read", 
+  [ "\033[2XIO_read\033[102X", "3.2-46", [ 3, 2, 46 ], 469, 16, "io_read", 
       "X84F3D862836BF17C" ], 
-  [ "\033[2XIO_readdir\033[102X", "3.2-47", [ 3, 2, 47 ], 475, 16, 
+  [ "\033[2XIO_readdir\033[102X", "3.2-47", [ 3, 2, 47 ], 480, 16, 
       "io_readdir", "X8410C6F17DE9302D" ], 
-  [ "\033[2XIO_readlink\033[102X", "3.2-48", [ 3, 2, 48 ], 485, 16, 
+  [ "\033[2XIO_readlink\033[102X", "3.2-48", [ 3, 2, 48 ], 490, 16, 
       "io_readlink", "X7943F25E7EBA9A6B" ], 
-  [ "\033[2XIO_recv\033[102X", "3.2-49", [ 3, 2, 49 ], 493, 16, "io_recv", 
+  [ "\033[2XIO_recv\033[102X", "3.2-49", [ 3, 2, 49 ], 498, 16, "io_recv", 
       "X78EB295E78B363B2" ], 
-  [ "\033[2XIO_recvfrom\033[102X", "3.2-50", [ 3, 2, 50 ], 502, 17, 
+  [ "\033[2XIO_recvfrom\033[102X", "3.2-50", [ 3, 2, 50 ], 507, 17, 
       "io_recvfrom", "X84C617887EE02EB4" ], 
-  [ "\033[2XIO_rename\033[102X", "3.2-51", [ 3, 2, 51 ], 513, 17, 
+  [ "\033[2XIO_rename\033[102X", "3.2-51", [ 3, 2, 51 ], 518, 17, 
       "io_rename", "X78EC95007A92AB69" ], 
-  [ "\033[2XIO_rewinddir\033[102X", "3.2-52", [ 3, 2, 52 ], 520, 17, 
+  [ "\033[2XIO_rewinddir\033[102X", "3.2-52", [ 3, 2, 52 ], 525, 17, 
       "io_rewinddir", "X7F86DBEB7876FBA5" ], 
-  [ "\033[2XIO_rmdir\033[102X", "3.2-53", [ 3, 2, 53 ], 529, 17, "io_rmdir", 
+  [ "\033[2XIO_rmdir\033[102X", "3.2-53", [ 3, 2, 53 ], 534, 17, "io_rmdir", 
       "X7FA4DD537C83A199" ], 
-  [ "\033[2XIO_seekdir\033[102X", "3.2-54", [ 3, 2, 54 ], 536, 17, 
+  [ "\033[2XIO_seekdir\033[102X", "3.2-54", [ 3, 2, 54 ], 541, 17, 
       "io_seekdir", "X84A98D2380BF6574" ], 
-  [ "\033[2XIO_select\033[102X", "3.2-55", [ 3, 2, 55 ], 545, 17, 
+  [ "\033[2XIO_select\033[102X", "3.2-55", [ 3, 2, 55 ], 550, 17, 
       "io_select", "X81CA6EE88062010E" ], 
-  [ "\033[2XIO_send\033[102X", "3.2-56", [ 3, 2, 56 ], 557, 18, "io_send", 
+  [ "\033[2XIO_send\033[102X", "3.2-56", [ 3, 2, 56 ], 562, 18, "io_send", 
       "X87019FD887F55C27" ], 
-  [ "\033[2XIO_sendto\033[102X", "3.2-57", [ 3, 2, 57 ], 567, 18, 
+  [ "\033[2XIO_sendto\033[102X", "3.2-57", [ 3, 2, 57 ], 572, 18, 
       "io_sendto", "X8388B0147B5745EC" ], 
-  [ "\033[2XIO_setenv\033[102X", "3.2-58", [ 3, 2, 58 ], 579, 18, 
+  [ "\033[2XIO_setenv\033[102X", "3.2-58", [ 3, 2, 58 ], 584, 18, 
       "io_setenv", "X7D2AB8E985C56AD4" ], 
-  [ "\033[2XIO_setsockopt\033[102X", "3.2-59", [ 3, 2, 59 ], 588, 18, 
+  [ "\033[2XIO_setsockopt\033[102X", "3.2-59", [ 3, 2, 59 ], 593, 18, 
       "io_setsockopt", "X7BE641C1784D0899" ], 
-  [ "\033[2XIO_socket\033[102X", "3.2-60", [ 3, 2, 60 ], 597, 18, 
+  [ "\033[2XIO_socket\033[102X", "3.2-60", [ 3, 2, 60 ], 602, 18, 
       "io_socket", "X852B16CF82B96C84" ], 
-  [ "\033[2XIO_stat\033[102X", "3.2-61", [ 3, 2, 61 ], 607, 18, "io_stat", 
+  [ "\033[2XIO_stat\033[102X", "3.2-61", [ 3, 2, 61 ], 612, 18, "io_stat", 
       "X7F7D23867B45D525" ], 
-  [ "\033[2XIO_symlink\033[102X", "3.2-62", [ 3, 2, 62 ], 615, 19, 
+  [ "\033[2XIO_symlink\033[102X", "3.2-62", [ 3, 2, 62 ], 620, 19, 
       "io_symlink", "X7B0D9CEF7A3CD431" ], 
-  [ "\033[2XIO_telldir\033[102X", "3.2-63", [ 3, 2, 63 ], 622, 19, 
+  [ "\033[2XIO_telldir\033[102X", "3.2-63", [ 3, 2, 63 ], 627, 19, 
       "io_telldir", "X81FF8B678748900B" ], 
-  [ "\033[2XIO_unlink\033[102X", "3.2-64", [ 3, 2, 64 ], 631, 19, 
+  [ "\033[2XIO_unlink\033[102X", "3.2-64", [ 3, 2, 64 ], 636, 19, 
       "io_unlink", "X78C93B6587B478C2" ], 
-  [ "\033[2XIO_unsetenv\033[102X", "3.2-65", [ 3, 2, 65 ], 639, 19, 
+  [ "\033[2XIO_unsetenv\033[102X", "3.2-65", [ 3, 2, 65 ], 644, 19, 
       "io_unsetenv", "X8103218E7C5CF577" ], 
-  [ "\033[2XIO_WaitPid\033[102X", "3.2-66", [ 3, 2, 66 ], 646, 19, 
+  [ "\033[2XIO_WaitPid\033[102X", "3.2-66", [ 3, 2, 66 ], 651, 19, 
       "io_waitpid", "X80737A008450184F" ], 
-  [ "\033[2XIO_IgnorePid\033[102X", "3.2-67", [ 3, 2, 67 ], 665, 19, 
+  [ "\033[2XIO_IgnorePid\033[102X", "3.2-67", [ 3, 2, 67 ], 670, 19, 
       "io_ignorepid", "X84295FC77CCB1066" ], 
-  [ "\033[2XIO_write\033[102X", "3.2-68", [ 3, 2, 68 ], 674, 20, "io_write", 
+  [ "\033[2XIO_write\033[102X", "3.2-68", [ 3, 2, 68 ], 679, 20, "io_write", 
       "X84EB06707D1BD3F1" ], 
-  [ "\033[2XIO_make_sockaddr_in\033[102X", "3.3-1", [ 3, 3, 1 ], 690, 20, 
+  [ "\033[2XIO_make_sockaddr_in\033[102X", "3.3-1", [ 3, 3, 1 ], 695, 20, 
       "io_make_sockaddr_in", "X878007A67E806CEF" ], 
-  [ "\033[2XIO_environ\033[102X", "3.3-2", [ 3, 3, 2 ], 701, 20, 
+  [ "\033[2XIO_environ\033[102X", "3.3-2", [ 3, 3, 2 ], 706, 20, 
       "io_environ", "X7F3E88AD7EFD52F4" ], 
-  [ "\033[2XIO_InstallSIGCHLDHandler\033[102X", "3.3-3", [ 3, 3, 3 ], 709, 
+  [ "\033[2XIO_InstallSIGCHLDHandler\033[102X", "3.3-3", [ 3, 3, 3 ], 714, 
       20, "io_installsigchldhandler", "X8383E62D86BE30C6" ], 
-  [ "\033[2XIO_RestoreSIGCHLDHandler\033[102X", "3.3-4", [ 3, 3, 4 ], 722, 
+  [ "\033[2XIO_RestoreSIGCHLDHandler\033[102X", "3.3-4", [ 3, 3, 4 ], 733, 
       20, "io_restoresigchldhandler", "X7EEB7471816B64DF" ], 
-  [ "\033[2XIsFile\033[102X", "4.1-1", [ 4, 1, 1 ], 34, 21, "isfile", 
+  [ "\033[2XIsFile\033[102X", "4.1-1", [ 4, 1, 1 ], 34, 22, "isfile", 
       "X80C9B80A80E3A555" ], 
-  [ "\033[2XIO_WrapFD\033[102X", "4.1-2", [ 4, 1, 2 ], 43, 21, "io_wrapfd", 
+  [ "\033[2XIO_WrapFD\033[102X", "4.1-2", [ 4, 1, 2 ], 43, 22, "io_wrapfd", 
       "X7DDB0BA6836DA208" ], 
-  [ "\033[2XIO_File\033[102X mode", "4.1-3", [ 4, 1, 3 ], 66, 22, 
+  [ "\033[2XIO_File\033[102X mode", "4.1-3", [ 4, 1, 3 ], 66, 23, 
       "io_file mode", "X7EC160D07E815DBB" ], 
-  [ "\033[2XIO_File\033[102X bufsize", "4.1-3", [ 4, 1, 3 ], 66, 22, 
+  [ "\033[2XIO_File\033[102X bufsize", "4.1-3", [ 4, 1, 3 ], 66, 23, 
       "io_file bufsize", "X7EC160D07E815DBB" ], 
-  [ "\033[2XIO_File\033[102X mode and bufsize", "4.1-3", [ 4, 1, 3 ], 66, 22, 
+  [ "\033[2XIO_File\033[102X mode and bufsize", "4.1-3", [ 4, 1, 3 ], 66, 23, 
       "io_file mode and bufsize", "X7EC160D07E815DBB" ], 
-  [ "\033[2XIO_ReadUntilEOF\033[102X", "4.2-1", [ 4, 2, 1 ], 96, 22, 
+  [ "\033[2XIO_ReadUntilEOF\033[102X", "4.2-1", [ 4, 2, 1 ], 96, 23, 
       "io_readuntileof", "X865A873E78C822B7" ], 
-  [ "\033[2XIO_ReadBlock\033[102X", "4.2-2", [ 4, 2, 2 ], 107, 22, 
+  [ "\033[2XIO_ReadBlock\033[102X", "4.2-2", [ 4, 2, 2 ], 107, 23, 
       "io_readblock", "X7D2686ED854BEF95" ], 
-  [ "\033[2XIO_ReadLine\033[102X", "4.2-3", [ 4, 2, 3 ], 122, 23, 
+  [ "\033[2XIO_ReadLine\033[102X", "4.2-3", [ 4, 2, 3 ], 122, 24, 
       "io_readline", "X8738708E7B9DF8DB" ], 
-  [ "\033[2XIO_ReadLines\033[102X", "4.2-4", [ 4, 2, 4 ], 142, 23, 
+  [ "\033[2XIO_ReadLines\033[102X", "4.2-4", [ 4, 2, 4 ], 142, 24, 
       "io_readlines", "X81E72756806C0945" ], 
-  [ "\033[2XIO_HasData\033[102X", "4.2-5", [ 4, 2, 5 ], 162, 23, 
+  [ "\033[2XIO_HasData\033[102X", "4.2-5", [ 4, 2, 5 ], 162, 24, 
       "io_hasdata", "X87E0AC547835F21D" ], 
-  [ "\033[2XIO_Read\033[102X", "4.2-6", [ 4, 2, 6 ], 173, 23, "io_read", 
+  [ "\033[2XIO_Read\033[102X", "4.2-6", [ 4, 2, 6 ], 173, 24, "io_read", 
       "X84F3D862836BF17C" ], 
-  [ "\033[2XIO_Write\033[102X", "4.2-7", [ 4, 2, 7 ], 195, 24, "io_write", 
+  [ "\033[2XIO_Write\033[102X", "4.2-7", [ 4, 2, 7 ], 195, 25, "io_write", 
       "X84EB06707D1BD3F1" ], 
-  [ "\033[2XIO_WriteLine\033[102X", "4.2-8", [ 4, 2, 8 ], 216, 24, 
+  [ "\033[2XIO_WriteLine\033[102X", "4.2-8", [ 4, 2, 8 ], 216, 25, 
       "io_writeline", "X83A03ACB81F53BB1" ], 
-  [ "\033[2XIO_WriteLines\033[102X", "4.2-9", [ 4, 2, 9 ], 227, 24, 
+  [ "\033[2XIO_WriteLines\033[102X", "4.2-9", [ 4, 2, 9 ], 227, 25, 
       "io_writelines", "X87CE6EC17C1573AC" ], 
-  [ "\033[2XIO_Flush\033[102X", "4.2-10", [ 4, 2, 10 ], 238, 24, "io_flush", 
+  [ "\033[2XIO_Flush\033[102X", "4.2-10", [ 4, 2, 10 ], 238, 25, "io_flush", 
       "X7873A49F7CC7ECFB" ], 
-  [ "\033[2XIO_WriteFlush\033[102X", "4.2-11", [ 4, 2, 11 ], 256, 25, 
+  [ "\033[2XIO_WriteFlush\033[102X", "4.2-11", [ 4, 2, 11 ], 256, 26, 
       "io_writeflush", "X7870634278F6C69F" ], 
-  [ "\033[2XIO_ReadyForWrite\033[102X", "4.2-12", [ 4, 2, 12 ], 265, 25, 
+  [ "\033[2XIO_ReadyForWrite\033[102X", "4.2-12", [ 4, 2, 12 ], 265, 26, 
       "io_readyforwrite", "X80CF240F78664DF4" ], 
-  [ "\033[2XIO_WriteNonBlocking\033[102X", "4.2-13", [ 4, 2, 13 ], 275, 25, 
+  [ "\033[2XIO_WriteNonBlocking\033[102X", "4.2-13", [ 4, 2, 13 ], 275, 26, 
       "io_writenonblocking", "X84052F9886ADED0D" ], 
-  [ "\033[2XIO_ReadyForFlush\033[102X", "4.2-14", [ 4, 2, 14 ], 290, 25, 
+  [ "\033[2XIO_ReadyForFlush\033[102X", "4.2-14", [ 4, 2, 14 ], 290, 26, 
       "io_readyforflush", "X7C5786E07813434B" ], 
-  [ "\033[2XIO_FlushNonBlocking\033[102X", "4.2-15", [ 4, 2, 15 ], 302, 26, 
+  [ "\033[2XIO_FlushNonBlocking\033[102X", "4.2-15", [ 4, 2, 15 ], 302, 27, 
       "io_flushnonblocking", "X80E977B48771D207" ], 
-  [ "\033[2XIO_Close\033[102X", "4.2-16", [ 4, 2, 16 ], 315, 26, "io_close", 
+  [ "\033[2XIO_Close\033[102X", "4.2-16", [ 4, 2, 16 ], 315, 27, "io_close", 
       "X820DA9C97C2E80BA" ], 
-  [ "\033[2XIO_GetFD\033[102X", "4.3-1", [ 4, 3, 1 ], 329, 26, "io_getfd", 
+  [ "\033[2XIO_GetFD\033[102X", "4.3-1", [ 4, 3, 1 ], 329, 27, "io_getfd", 
       "X7F893EFC7D0C7BF2" ], 
-  [ "\033[2XIO_GetWBuf\033[102X", "4.3-2", [ 4, 3, 2 ], 337, 26, 
+  [ "\033[2XIO_GetWBuf\033[102X", "4.3-2", [ 4, 3, 2 ], 337, 27, 
       "io_getwbuf", "X86666C9681EA7297" ], 
-  [ "\033[2XIO_Select\033[102X", "4.3-3", [ 4, 3, 3 ], 348, 26, "io_select", 
+  [ "\033[2XIO_Select\033[102X", "4.3-3", [ 4, 3, 3 ], 348, 27, "io_select", 
       "X81CA6EE88062010E" ], 
-  [ "\033[2XIO_ListDir\033[102X", "4.3-4", [ 4, 3, 4 ], 375, 27, 
+  [ "\033[2XIO_ListDir\033[102X", "4.3-4", [ 4, 3, 4 ], 375, 28, 
       "io_listdir", "X84B16DB878265F02" ], 
-  [ "\033[2XChangeDirectoryCurrent\033[102X", "4.3-5", [ 4, 3, 5 ], 384, 27, 
+  [ "\033[2XChangeDirectoryCurrent\033[102X", "4.3-5", [ 4, 3, 5 ], 384, 28, 
       "changedirectorycurrent", "X81DDD2E87F68E086" ], 
-  [ "\033[2XIO_MakeIPAddressPort\033[102X", "4.3-6", [ 4, 3, 6 ], 396, 27, 
+  [ "\033[2XIO_MakeIPAddressPort\033[102X", "4.3-6", [ 4, 3, 6 ], 396, 28, 
       "io_makeipaddressport", "X8568CE6684C90CE5" ], 
-  [ "\033[2XIO_Environment\033[102X", "4.3-7", [ 4, 3, 7 ], 409, 27, 
+  [ "\033[2XIO_Environment\033[102X", "4.3-7", [ 4, 3, 7 ], 409, 28, 
       "io_environment", "X7F9AAE018474E1D8" ], 
-  [ "\033[2XIO_MakeEnvList\033[102X", "4.3-8", [ 4, 3, 8 ], 421, 27, 
+  [ "\033[2XIO_MakeEnvList\033[102X", "4.3-8", [ 4, 3, 8 ], 421, 28, 
       "io_makeenvlist", "X7CF3DB5081A91600" ], 
-  [ "\033[2XIO_FindExecutable\033[102X", "4.4-1", [ 4, 4, 1 ], 432, 28, 
+  [ "\033[2XIO_FindExecutable\033[102X", "4.4-1", [ 4, 4, 1 ], 432, 29, 
       "io_findexecutable", "X84E91FE27A7860F3" ], 
-  [ "\033[2XIO_CloseAllFDs\033[102X", "4.4-2", [ 4, 4, 2 ], 447, 28, 
+  [ "\033[2XIO_CloseAllFDs\033[102X", "4.4-2", [ 4, 4, 2 ], 447, 29, 
       "io_closeallfds", "X7C43017E7AC5973A" ], 
-  [ "\033[2XIO_Popen\033[102X", "4.4-3", [ 4, 4, 3 ], 455, 28, "io_popen", 
+  [ "\033[2XIO_Popen\033[102X", "4.4-3", [ 4, 4, 3 ], 455, 29, "io_popen", 
       "X7891F56386C008CE" ], 
-  [ "\033[2XIO_Popen2\033[102X", "4.4-4", [ 4, 4, 4 ], 490, 28, "io_popen2", 
+  [ "\033[2XIO_Popen2\033[102X", "4.4-4", [ 4, 4, 4 ], 490, 29, "io_popen2", 
       "X7E05CF6481CBC0A1" ], 
-  [ "\033[2XIO_Popen3\033[102X", "4.4-5", [ 4, 4, 5 ], 520, 29, "io_popen3", 
+  [ "\033[2XIO_Popen3\033[102X", "4.4-5", [ 4, 4, 5 ], 520, 30, "io_popen3", 
       "X7975BC6D80BC71E5" ], 
-  [ "\033[2XIO_StartPipeline\033[102X", "4.4-6", [ 4, 4, 6 ], 550, 29, 
+  [ "\033[2XIO_StartPipeline\033[102X", "4.4-6", [ 4, 4, 6 ], 550, 30, 
       "io_startpipeline", "X813219C17FB54731" ], 
-  [ "\033[2XIO_StringFilterFile\033[102X", "4.4-7", [ 4, 4, 7 ], 582, 30, 
+  [ "\033[2XIO_StringFilterFile\033[102X", "4.4-7", [ 4, 4, 7 ], 582, 31, 
       "io_stringfilterfile", "X86D61FAE871B23E8" ], 
   [ "\033[2XIO_FileFilterString\033[102X append", "4.4-8", [ 4, 4, 8 ], 592, 
-      30, "io_filefilterstring append", "X83E765D783531845" ], 
-  [ "\033[2XIO_FilteredFile\033[102X", "4.4-9", [ 4, 4, 9 ], 604, 30, 
+      31, "io_filefilterstring append", "X83E765D783531845" ], 
+  [ "\033[2XIO_FilteredFile\033[102X", "4.4-9", [ 4, 4, 9 ], 604, 31, 
       "io_filteredfile", "X801CE3708656FB00" ], 
-  [ "\033[2XIO_CompressedFile\033[102X", "4.4-10", [ 4, 4, 10 ], 626, 31, 
+  [ "\033[2XIO_CompressedFile\033[102X", "4.4-10", [ 4, 4, 10 ], 626, 32, 
       "io_compressedfile", "X7B425F3B7A68C2FB" ], 
   [ "\033[2XIO_SendStringBackground\033[102X", "4.4-11", [ 4, 4, 11 ], 645, 
-      31, "io_sendstringbackground", "X7D62E9C57F1F96FB" ], 
-  [ "\033[2XIO_PipeThrough\033[102X", "4.4-12", [ 4, 4, 12 ], 678, 31, 
+      32, "io_sendstringbackground", "X7D62E9C57F1F96FB" ], 
+  [ "\033[2XIO_PipeThrough\033[102X", "4.4-12", [ 4, 4, 12 ], 678, 32, 
       "io_pipethrough", "X8484B0CD7836A19E" ], 
   [ "\033[2XIO_PipeThroughWithError\033[102X", "4.4-13", [ 4, 4, 13 ], 697, 
-      32, "io_pipethroughwitherror", "X7A9ACA3979635506" ], 
-  [ "\033[2XIO_Error\033[102X", "5.1-1", [ 5, 1, 1 ], 24, 33, "io_error", 
+      33, "io_pipethroughwitherror", "X7A9ACA3979635506" ], 
+  [ "\033[2XIO_Error\033[102X", "5.1-1", [ 5, 1, 1 ], 24, 34, "io_error", 
       "X86E06A128511BA25" ], 
-  [ "\033[2XIO_Nothing\033[102X", "5.1-2", [ 5, 1, 2 ], 30, 33, "io_nothing", 
+  [ "\033[2XIO_Nothing\033[102X", "5.1-2", [ 5, 1, 2 ], 30, 34, "io_nothing", 
       "X7887BFCF824B439B" ], 
-  [ "\033[2XIO_OK\033[102X", "5.1-3", [ 5, 1, 3 ], 37, 33, "io_ok", 
+  [ "\033[2XIO_OK\033[102X", "5.1-3", [ 5, 1, 3 ], 37, 34, "io_ok", 
       "X7D4D092B8401EA0F" ], 
-  [ "\033[2XIO_Pickle\033[102X", "5.2-1", [ 5, 2, 1 ], 50, 34, "io_pickle", 
+  [ "\033[2XIO_Pickle\033[102X", "5.2-1", [ 5, 2, 1 ], 50, 35, "io_pickle", 
       "X7E01770481297DF1" ], 
-  [ "\033[2XIO_Unpickle\033[102X", "5.2-2", [ 5, 2, 2 ], 75, 34, 
+  [ "\033[2XIO_Unpickle\033[102X", "5.2-2", [ 5, 2, 2 ], 75, 35, 
       "io_unpickle", "X8228EE63809A6DEF" ], 
-  [ "\033[2XIO_ClearPickleCache\033[102X", "5.2-3", [ 5, 2, 3 ], 86, 34, 
+  [ "\033[2XIO_ClearPickleCache\033[102X", "5.2-3", [ 5, 2, 3 ], 86, 35, 
       "io_clearpicklecache", "X844736FB80F6EE97" ], 
-  [ "\033[2XRandomSource\033[102X", "6.1-1", [ 6, 1, 1 ], 14, 36, 
+  [ "\033[2XRandomSource\033[102X", "6.1-1", [ 6, 1, 1 ], 14, 37, 
       "randomsource", "X7CB0B5BC82F8FD8F" ], 
-  [ "\033[2XOpenHTTPConnection\033[102X", "7.1-1", [ 7, 1, 1 ], 12, 37, 
+  [ "\033[2XOpenHTTPConnection\033[102X", "7.1-1", [ 7, 1, 1 ], 12, 38, 
       "openhttpconnection", "X7B5588D5856BE6DD" ], 
-  [ "\033[2XHTTPRequest\033[102X", "7.1-2", [ 7, 1, 2 ], 31, 37, 
+  [ "\033[2XHTTPRequest\033[102X", "7.1-2", [ 7, 1, 2 ], 31, 38, 
       "httprequest", "X80FF9E307BDA0659" ], 
-  [ "\033[2XHTTPTimeoutForSelect\033[102X", "7.1-3", [ 7, 1, 3 ], 79, 38, 
+  [ "\033[2XHTTPTimeoutForSelect\033[102X", "7.1-3", [ 7, 1, 3 ], 79, 39, 
       "httptimeoutforselect", "X83526BF378B3D8F2" ], 
-  [ "\033[2XCloseHTTPConnection\033[102X", "7.1-4", [ 7, 1, 4 ], 95, 38, 
+  [ "\033[2XCloseHTTPConnection\033[102X", "7.1-4", [ 7, 1, 4 ], 95, 39, 
       "closehttpconnection", "X81702FA07F2AF472" ], 
-  [ "\033[2XSingleHTTPRequest\033[102X", "7.1-5", [ 7, 1, 5 ], 103, 39, 
+  [ "\033[2XSingleHTTPRequest\033[102X", "7.1-5", [ 7, 1, 5 ], 103, 40, 
       "singlehttprequest", "X7DBCB0B4801E4D6D" ], 
-  [ "\033[2XCheckForUpdates\033[102X", "7.1-6", [ 7, 1, 6 ], 119, 39, 
+  [ "\033[2XCheckForUpdates\033[102X", "7.1-6", [ 7, 1, 6 ], 119, 40, 
       "checkforupdates", "X78BAF7A77F6BE631" ], 
-  [ "\033[2XReadWeb\033[102X", "7.1-7", [ 7, 1, 7 ], 130, 39, "readweb", 
+  [ "\033[2XReadWeb\033[102X", "7.1-7", [ 7, 1, 7 ], 130, 40, "readweb", 
       "X872B174F7FFD345B" ], 
-  [ "\033[2XBackgroundJobByFork\033[102X", "8.1-1", [ 8, 1, 1 ], 33, 40, 
+  [ "\033[2XBackgroundJobByFork\033[102X", "8.1-1", [ 8, 1, 1 ], 33, 41, 
       "backgroundjobbyfork", "X7FE0061F8484814B" ], 
-  [ "\033[2XIsIdle\033[102X bgjob", "8.1-2", [ 8, 1, 2 ], 67, 41, 
+  [ "\033[2XIsIdle\033[102X bgjob", "8.1-2", [ 8, 1, 2 ], 67, 42, 
       "isidle bgjob", "X7B7D934583257B9A" ], 
-  [ "\033[2XHasTerminated\033[102X", "8.1-3", [ 8, 1, 3 ], 82, 41, 
+  [ "\033[2XHasTerminated\033[102X", "8.1-3", [ 8, 1, 3 ], 82, 42, 
       "hasterminated", "X86E1283D7AD05169" ], 
-  [ "\033[2XWaitUntilIdle\033[102X", "8.1-4", [ 8, 1, 4 ], 91, 41, 
+  [ "\033[2XWaitUntilIdle\033[102X", "8.1-4", [ 8, 1, 4 ], 91, 42, 
       "waituntilidle", "X7C139805804E6FE1" ], 
-  [ "\033[2XPickup\033[102X bgjob", "8.1-5", [ 8, 1, 5 ], 101, 41, 
+  [ "\033[2XPickup\033[102X bgjob", "8.1-5", [ 8, 1, 5 ], 101, 42, 
       "pickup bgjob", "X7F4B8B9078D0E18E" ], 
-  [ "\033[2XSubmit\033[102X bgjob", "8.1-6", [ 8, 1, 6 ], 108, 42, 
+  [ "\033[2XSubmit\033[102X bgjob", "8.1-6", [ 8, 1, 6 ], 108, 43, 
       "submit bgjob", "X864492F37E858197" ], 
-  [ "\033[2XKill\033[102X bgjob", "8.1-7", [ 8, 1, 7 ], 126, 42, 
+  [ "\033[2XKill\033[102X bgjob", "8.1-7", [ 8, 1, 7 ], 126, 43, 
       "kill bgjob", "X841B3A1A7967DEA4" ], 
   [ "\033[2XParTakeFirstResultByFork\033[102X", "8.2-1", [ 8, 2, 1 ], 144, 
-      42, "partakefirstresultbyfork", "X78A59A628449960F" ], 
-  [ "\033[2XParDoByFork\033[102X", "8.2-2", [ 8, 2, 2 ], 169, 43, 
+      43, "partakefirstresultbyfork", "X78A59A628449960F" ], 
+  [ "\033[2XParDoByFork\033[102X", "8.2-2", [ 8, 2, 2 ], 169, 44, 
       "pardobyfork", "X7A1F40D1841C36D2" ], 
-  [ "\033[2XParListByFork\033[102X", "8.2-3", [ 8, 2, 3 ], 192, 43, 
+  [ "\033[2XParListByFork\033[102X", "8.2-3", [ 8, 2, 3 ], 192, 44, 
       "parlistbyfork", "X80DA6945873DCC66" ], 
-  [ "\033[2XParMapReduceByFork\033[102X", "8.2-4", [ 8, 2, 4 ], 210, 43, 
+  [ "\033[2XParMapReduceByFork\033[102X", "8.2-4", [ 8, 2, 4 ], 210, 44, 
       "parmapreducebyfork", "X7AD5D85283BC41AC" ], 
-  [ "Timeouts", "8.2-4", [ 8, 2, 4 ], 210, 43, "timeouts", 
+  [ "Timeouts", "8.2-4", [ 8, 2, 4 ], 210, 44, "timeouts", 
       "X7AD5D85283BC41AC" ], 
-  [ "\033[2XIO_CallWithTimeout\033[102X", "8.2-5", [ 8, 2, 5 ], 229, 43, 
+  [ "\033[2XIO_CallWithTimeout\033[102X", "8.2-5", [ 8, 2, 5 ], 229, 44, 
       "io_callwithtimeout", "X7A5CCA557B7F8660" ], 
-  [ "\033[2XIO_CallWithTimeoutList\033[102X", "8.2-5", [ 8, 2, 5 ], 229, 43, 
+  [ "\033[2XIO_CallWithTimeoutList\033[102X", "8.2-5", [ 8, 2, 5 ], 229, 44, 
       "io_callwithtimeoutlist", "X7A5CCA557B7F8660" ], 
-  [ "\033[2XParWorkerFarmByFork\033[102X", "8.3-1", [ 8, 3, 1 ], 287, 44, 
+  [ "\033[2XParWorkerFarmByFork\033[102X", "8.3-1", [ 8, 3, 1 ], 287, 45, 
       "parworkerfarmbyfork", "X87896E477DCB9C55" ], 
-  [ "\033[2XDoQueues\033[102X", "8.3-2", [ 8, 3, 2 ], 301, 45, "doqueues", 
+  [ "\033[2XDoQueues\033[102X", "8.3-2", [ 8, 3, 2 ], 301, 46, "doqueues", 
       "X7ED2CE687EA7FC66" ], 
-  [ "\033[2XKill\033[102X wfarm", "8.3-3", [ 8, 3, 3 ], 328, 45, 
+  [ "\033[2XKill\033[102X wfarm", "8.3-3", [ 8, 3, 3 ], 328, 46, 
       "kill wfarm", "X83289405792FF902" ], 
-  [ "\033[2XIsIdle\033[102X wfarm", "8.3-4", [ 8, 3, 4 ], 337, 45, 
+  [ "\033[2XIsIdle\033[102X wfarm", "8.3-4", [ 8, 3, 4 ], 337, 46, 
       "isidle wfarm", "X7C4E3D5A7FE617FE" ], 
-  [ "\033[2XSubmit\033[102X wfarm", "8.3-5", [ 8, 3, 5 ], 348, 45, 
+  [ "\033[2XSubmit\033[102X wfarm", "8.3-5", [ 8, 3, 5 ], 348, 46, 
       "submit wfarm", "X81773CEC8246EDF3" ], 
-  [ "\033[2XPickup\033[102X wfarm", "8.3-6", [ 8, 3, 6 ], 359, 45, 
+  [ "\033[2XPickup\033[102X wfarm", "8.3-6", [ 8, 3, 6 ], 359, 46, 
       "pickup wfarm", "X7878258F84138DEA" ], 
-  [ "\033[2XIOHub\033[102X", "9.2-1", [ 9, 2, 1 ], 28, 47, "iohub", 
+  [ "\033[2XIOHub\033[102X", "9.2-1", [ 9, 2, 1 ], 28, 48, "iohub", 
       "X83C0523D8538E866" ], 
-  [ "\033[2XNewConnection\033[102X", "9.2-2", [ 9, 2, 2 ], 35, 47, 
+  [ "\033[2XNewConnection\033[102X", "9.2-2", [ 9, 2, 2 ], 35, 48, 
       "newconnection", "X7D1D9A8D837ECCEB" ], 
-  [ "\033[2XCloseConnection\033[102X", "9.2-3", [ 9, 2, 3 ], 57, 48, 
+  [ "\033[2XCloseConnection\033[102X", "9.2-3", [ 9, 2, 3 ], 57, 49, 
       "closeconnection", "X8553D2E47C05797F" ], 
-  [ "\033[2XAttachServingSocket\033[102X", "9.2-4", [ 9, 2, 4 ], 66, 48, 
+  [ "\033[2XAttachServingSocket\033[102X", "9.2-4", [ 9, 2, 4 ], 66, 49, 
       "attachservingsocket", "X7F7FD824866CB582" ], 
-  [ "\033[2XShutdownServingSocket\033[102X", "9.2-5", [ 9, 2, 5 ], 79, 48, 
+  [ "\033[2XShutdownServingSocket\033[102X", "9.2-5", [ 9, 2, 5 ], 79, 49, 
       "shutdownservingsocket", "X7866F9DA8358968C" ], 
-  [ "\033[2XShutdown\033[102X", "9.2-6", [ 9, 2, 6 ], 87, 48, "shutdown", 
+  [ "\033[2XShutdown\033[102X", "9.2-6", [ 9, 2, 6 ], 87, 49, "shutdown", 
       "X84AFBD658118ABB8" ], 
-  [ "\033[2XAcceptNewConnection\033[102X", "9.2-7", [ 9, 2, 7 ], 97, 48, 
+  [ "\033[2XAcceptNewConnection\033[102X", "9.2-7", [ 9, 2, 7 ], 97, 49, 
       "acceptnewconnection", "X7BE1B9FD82C9B8E0" ], 
-  [ "\033[2XSubmitOutput\033[102X", "9.2-8", [ 9, 2, 8 ], 113, 49, 
+  [ "\033[2XSubmitOutput\033[102X", "9.2-8", [ 9, 2, 8 ], 113, 50, 
       "submitoutput", "X85F634D4826D89F1" ], 
-  [ "\033[2XGetInput\033[102X", "9.2-9", [ 9, 2, 9 ], 125, 49, "getinput", 
+  [ "\033[2XGetInput\033[102X", "9.2-9", [ 9, 2, 9 ], 125, 50, "getinput", 
       "X837629707DF9B60E" ], 
-  [ "\033[2XNewTCPConnection\033[102X", "9.2-10", [ 9, 2, 10 ], 140, 49, 
+  [ "\033[2XNewTCPConnection\033[102X", "9.2-10", [ 9, 2, 10 ], 140, 50, 
       "newtcpconnection", "X79031BC687502CB6" ], 
-  [ "\033[2XOutputQueue\033[102X", "9.2-11", [ 9, 2, 11 ], 153, 49, 
+  [ "\033[2XOutputQueue\033[102X", "9.2-11", [ 9, 2, 11 ], 153, 50, 
       "outputqueue", "X7F8C7F5782213A71" ], 
-  [ "\033[2XInputQueue\033[102X", "9.2-12", [ 9, 2, 12 ], 164, 50, 
+  [ "\033[2XInputQueue\033[102X", "9.2-12", [ 9, 2, 12 ], 164, 51, 
       "inputqueue", "X7972FF1C7B59D0A4" ], 
-  [ "\033[2XDoIO\033[102X", "9.2-13", [ 9, 2, 13 ], 175, 50, "doio", 
+  [ "\033[2XDoIO\033[102X", "9.2-13", [ 9, 2, 13 ], 175, 51, "doio", 
       "X810D418A802D09D1" ] ]
 );
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/io-4.10.0/doc/title.xml new/io-4.11.0/doc/title.xml
--- old/io-4.10.0/doc/title.xml 2026-07-14 02:00:00.000000000 +0200
+++ new/io-4.11.0/doc/title.xml 2026-09-28 02:00:00.000000000 +0200
@@ -9,14 +9,14 @@
     Bindings for low level C library I/O routines
   </Subtitle>
   <Version>
-    4.10.0
+    4.11.0
   </Version>
   <Author>
     Max Neunhöffer
 <Email>[email protected]</Email>
   </Author>
   <Date>
-    14 July 2026
+    28 September 2026
   </Date>
   <Copyright>
     &copyright; 2005-2014 by Max Neunhöffer<P/>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/io-4.10.0/gap/unavailable.g new/io-4.11.0/gap/unavailable.g
--- old/io-4.10.0/gap/unavailable.g     1970-01-01 01:00:00.000000000 +0100
+++ new/io-4.11.0/gap/unavailable.g     2026-09-28 02:00:00.000000000 +0200
@@ -0,0 +1,44 @@
+#############################################################################
+##
+##  unavailable.g            The IO package
+##
+##  Stubs for kernel functions which are not available on this platform.
+##
+
+#
+# The C part registers each of the functions below only when configure found
+# the system call it wraps, so which ones exist depends on the platform. On
+# native Windows, for instance, there is no fork and there are no signals.
+#
+# Bind the missing ones here, before any of the GAP code that mentions them
+# is read: without this, reading it warns about unbound globals, and calling
+# one of them fails with a message that says nothing about the real reason.
+#
+BindGlobal( "IO_UnavailableFunc", function( name )
+    return function( arg )
+        Error( name, " is not available on this platform" );
+    end;
+end );
+
+BindGlobal( "IO_MaybeUnavailable", [
+  "IO_IgnorePid", "IO_InstallSIGCHLDHandler", "IO_RestoreSIGCHLDHandler",
+  "IO_WaitPid", "IO_accept", "IO_bind", "IO_chmod", "IO_chown",
+  "IO_closedir", "IO_connect", "IO_dup", "IO_dup2", "IO_fchmod",
+  "IO_fchown", "IO_fcntl", "IO_fork", "IO_fstat", "IO_gethostbyname",
+  "IO_gethostname", "IO_getpid", "IO_getppid", "IO_getsockname",
+  "IO_getsockopt", "IO_gettimeofday", "IO_gmtime", "IO_kill",
+  "IO_lchown", "IO_link", "IO_listen", "IO_localtime", "IO_lstat",
+  "IO_make_sockaddr_in", "IO_mkdir", "IO_mkdtemp", "IO_mkfifo",
+  "IO_mknod", "IO_mkstemp", "IO_opendir", "IO_pipe", "IO_readdir",
+  "IO_readlink", "IO_recv", "IO_recvfrom", "IO_rename", "IO_rewinddir",
+  "IO_rmdir", "IO_seekdir", "IO_select", "IO_send", "IO_sendto",
+  "IO_setsockopt", "IO_socket", "IO_stat", "IO_symlink", "IO_telldir",
+  "IO_unlink"
+] );
+
+for IO_name in IO_MaybeUnavailable do
+    if not IsBoundGlobal( IO_name ) then
+        BindGlobal( IO_name, IO_UnavailableFunc( IO_name ) );
+    fi;
+od;
+Unbind( IO_name );
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/io-4.10.0/init.g new/io-4.11.0/init.g
--- old/io-4.10.0/init.g        2026-07-14 02:00:00.000000000 +0200
+++ new/io-4.11.0/init.g        2026-09-28 02:00:00.000000000 +0200
@@ -17,6 +17,9 @@
   Error("failed to load the io package kernel extension");
 fi;
 
+# must come first: it binds the kernel functions this platform lacks
+ReadPackage("IO", "gap/unavailable.g");
+
 ReadPackage("IO", "gap/io.gd");
 ReadPackage("IO", "gap/pickle.gd");
 ReadPackage("IO", "gap/realrandom.gd");
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/io-4.10.0/src/io.c new/io-4.11.0/src/io.c
--- old/io-4.10.0/src/io.c      2026-07-14 02:00:00.000000000 +0200
+++ new/io-4.11.0/src/io.c      2026-09-28 02:00:00.000000000 +0200
@@ -38,6 +38,19 @@
 #include <time.h>
 #endif
 #include <errno.h>
+#ifdef _WIN32
+#include <direct.h>    // for _mkdir
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>    // for GetComputerNameA
+#endif
+
+// Tracking child processes needs SIGCHLD and waitpid, which native Windows
+// lacks; without them IO cannot run subprocesses at all. Decided from the
+// configure results alone: whether <signal.h> has been included by this
+// point, and so whether SIGCHLD is visible, differs between platforms.
+#if defined(HAVE_SIGNAL_H) && defined(HAVE_SIGNAL) && defined(HAVE_SYS_WAIT_H)
+#define IO_HAVE_SIGCHLD 1
+#endif
 #ifdef HAVE_SYS_STAT_H
 #include <sys/stat.h>
 #endif
@@ -104,6 +117,8 @@
  * we can read it out from GAP using IO.Wait.
  ***********************************************************************/
 
+#ifdef IO_HAVE_SIGCHLD
+
 // FIXME: globals
 
 #define MAXCHLDS 1024
@@ -173,6 +188,151 @@
 
 static void (*oldhandler)(int whichsig) = 0;    // the old handler
 
+/***********************************************************************
+ * Child reaping strategy.
+ *
+ * In standalone GAP the SIGCHLD handler above reaps every child with
+ * waitpid(-1) and queues the statuses in the FIFO. That is unusable when
+ * something else in the process manages children of its own: HPC-GAP
+ * handles SIGCHLD on a dedicated thread, and a program embedding GAP as a
+ * library (e.g. julia via GAP.jl) reaps its subprocesses per pid; a foreign
+ * SIGCHLD handler or a waitpid(-1) stealing their statuses makes them hang.
+ *
+ *                       standalone GAP        HPC-GAP / embedded GAP
+ *   SIGCHLD handler     IO_SIGCHLDHandler     none
+ *   reaping             waitpid(-1) in the    waitpid(pid) on demand, for
+ *                       handler, FIFO         pids registered by IO_fork
+ *
+ * In the second mode io keeps a registry of the children it forked itself
+ * and touches no other process.
+ ***********************************************************************/
+static int use_sigchld_handler = 1;
+
+typedef struct {
+    int pid;
+    int ignored;    // disowned via IO_IgnorePid: reap and forget
+} OwnChild;
+
+static OwnChild ownchildren[MAXCHLDS];
+static int      numownchildren = 0;
+
+static void RegisterOwnChild(int pid)
+{
+    if (numownchildren >= MAXCHLDS) {
+        Pr("#E Overflow in table of child processes\n", 0, 0);
+        return;
+    }
+    ownchildren[numownchildren].pid = pid;
+    ownchildren[numownchildren].ignored = 0;
+    numownchildren++;
+}
+
+static int FindOwnChild(int pid)
+{
+    for (int i = 0; i < numownchildren; i++)
+        if (ownchildren[i].pid == pid)
+            return i;
+    return -1;
+}
+
+static void ForgetOwnChild(int i)
+{
+    ownchildren[i] = ownchildren[--numownchildren];
+}
+
+// Reap disowned children that have exited, so they do not linger as
+// zombies; called whenever io deals with child processes anyway.
+static void ReapIgnoredOwnChildren(void)
+{
+    int i = 0;
+    while (i < numownchildren) {
+        int status;
+        if (ownchildren[i].ignored &&
+            waitpid(ownchildren[i].pid, &status, WNOHANG) != 0)
+            ForgetOwnChild(i);    // exited, or not our child any more
+        else
+            i++;
+    }
+}
+
+static Obj MakeWaitPidRecord(int pid, int status)
+{
+    Obj tmp = NEW_PREC(0);
+    AssPRec(tmp, RNamName("pid"), INTOBJ_INT(pid));
+    AssPRec(tmp, RNamName("status"), INTOBJ_INT(status));
+    AssPRec(tmp, RNamName("WIFEXITED"), INTOBJ_INT(WIFEXITED(status)));
+    AssPRec(tmp, RNamName("WEXITSTATUS"), INTOBJ_INT(WEXITSTATUS(status)));
+    return tmp;
+}
+
+// The status of <pid> is not available any more: it never was our child,
+// or something else in the process reaped it first. Report it as
+// terminated with unknown status if it is gone.
+static Obj WaitPidStatusLost(int pid, int wait)
+{
+    if (kill((pid_t)pid, 0) == -1 && errno == ESRCH) {
+        Obj tmp = NEW_PREC(0);
+        AssPRec(tmp, RNamName("pid"), INTOBJ_INT(pid));
+        AssPRec(tmp, RNamName("status"), Fail);
+        AssPRec(tmp, RNamName("WIFEXITED"), Fail);
+        AssPRec(tmp, RNamName("WEXITSTATUS"), Fail);
+        return tmp;
+    }
+    // pid still exists, but is not a child of this process
+    return wait ? Fail : False;
+}
+
+// IO_WaitPid without a SIGCHLD handler: wait for one specific registered
+// child, or (pid = -1) for any of them. The latter has to poll: waitpid()
+// blocks on a single pid or on all children (which would steal the host's),
+// and waiting for SIGCHLD would compete with the host's own handler.
+#define OWN_CHILD_POLL_INTERVAL_USEC 10000
+
+static Obj WaitForOwnChild(int pid, int wait)
+{
+    ReapIgnoredOwnChildren();
+
+    if (pid != -1) {
+        int status, retcode;
+        do {
+            retcode = waitpid(pid, &status, wait ? 0 : WNOHANG);
+        } while (retcode == -1 && errno == EINTR);
+        if (retcode == 0)
+            return False;
+        if (retcode == -1)
+            return WaitPidStatusLost(pid, wait);
+        int i = FindOwnChild(pid);
+        if (i != -1)
+            ForgetOwnChild(i);
+        return MakeWaitPidRecord(pid, status);
+    }
+
+    while (1) {
+        int waiting = 0;
+        for (int i = 0; i < numownchildren; i++) {
+            int status, retcode;
+            if (ownchildren[i].ignored)
+                continue;
+            retcode = waitpid(ownchildren[i].pid, &status, WNOHANG);
+            if (retcode == -1) {
+                ForgetOwnChild(i--);    // not our child any more
+                continue;
+            }
+            if (retcode == 0) {
+                waiting++;
+                continue;
+            }
+            ForgetOwnChild(i);
+            return MakeWaitPidRecord(retcode, status);
+        }
+        if (waiting == 0)
+            return Fail;    // nothing to wait for
+        if (!wait)
+            return False;
+        usleep(OWN_CHILD_POLL_INTERVAL_USEC);
+    }
+}
+
 static void IO_HandleChildSignal(int retcode, int status)
 {
     if (retcode > 0) {    // One of our child processes terminated
@@ -200,7 +360,6 @@
     }
 }
 
-#ifdef HAVE_SIGNAL
 void IO_SIGCHLDHandler(int whichsig)
 {
     int retcode, status;
@@ -215,6 +374,12 @@
 
 static Obj FuncIO_InstallSIGCHLDHandler(Obj self)
 {
+    if (!use_sigchld_handler) {
+        // still needed: writing to a pipe whose reader is gone must not
+        // kill the process
+        signal(SIGPIPE, SIG_IGN);
+        return False;
+    }
     // Do not install ourselves twice:
     if (oldhandler == 0) {
         oldhandler = signal(SIGCHLD, IO_SIGCHLDHandler);
@@ -226,7 +391,7 @@
 
 static Obj FuncIO_RestoreSIGCHLDHandler(Obj self)
 {
-    if (oldhandler == 0)
+    if (!use_sigchld_handler || oldhandler == 0)
         return False;
 
     signal(SIGCHLD, oldhandler);
@@ -267,6 +432,18 @@
         return Fail;
     }
 
+    if (!use_sigchld_handler) {
+        int i = FindOwnChild(pidc);
+        if (i == -1) {
+            RegisterOwnChild(pidc);
+            i = FindOwnChild(pidc);
+        }
+        if (i != -1)
+            ownchildren[i].ignored = 1;
+        ReapIgnoredOwnChildren();
+        return True;
+    }
+
     // Make sure a new signal doesn't come in while we are changing array
     signal(SIGCHLD, SIG_DFL);
 
@@ -302,9 +479,13 @@
         SyClearErrorNo();
         return Fail;
     }
+    pidc = INT_INTOBJ(pid);
+
+    if (!use_sigchld_handler)
+        return WaitForOwnChild(pidc, wait == True);
+
     // First set SIGCHLD to default action to avoid clashes with access:
     signal(SIGCHLD, SIG_DFL);
-    pidc = INT_INTOBJ(pid);
     reallytried = 0;
     do {
         pos = findSignaledPid(pidc);
@@ -317,15 +498,20 @@
         }
         // Really wait for something
         retcode = waitpid(-1, &status, (wait == True) ? 0 : WNOHANG);
+        if (retcode == -1 && errno == ECHILD) {
+            // There is no unreaped child left, so waiting cannot succeed;
+            // with wait = true, retrying would busy-loop forever. This
+            // happens when pid never was our child, or when something else
+            // in the process (another library, or a program embedding GAP)
+            // reaped it first and its status is lost. If the pid is gone,
+            // report it as terminated with unknown status.
+            signal(SIGCHLD, IO_SIGCHLDHandler);
+            return WaitPidStatusLost(pidc, wait == True);
+        }
         IO_HandleChildSignal(retcode, status);
         reallytried = 1;    // Do not try again.
     } while (1);            // Left by break
-    tmp = NEW_PREC(0);
-    AssPRec(tmp, RNamName("pid"), INTOBJ_INT(pids[pos]));
-    AssPRec(tmp, RNamName("status"), INTOBJ_INT(stats[pos]));
-    AssPRec(tmp, RNamName("WIFEXITED"), INTOBJ_INT(WIFEXITED(stats[pos])));
-    AssPRec(tmp, RNamName("WEXITSTATUS"),
-            INTOBJ_INT(WEXITSTATUS(stats[pos])));
+    tmp = MakeWaitPidRecord(pids[pos], stats[pos]);
 
     // Dequeue element:
     removeSignaledPidByPos(pos);
@@ -333,7 +519,7 @@
     signal(SIGCHLD, IO_SIGCHLDHandler);
     return tmp;
 }
-#endif
+#endif    // IO_HAVE_SIGCHLD
 
 static Obj FuncIO_open(Obj self, Obj path, Obj flags, Obj mode)
 {
@@ -670,7 +856,11 @@
     }
 
     char buf[PATH_MAX];
+#ifdef _WIN32
+    if (_fullpath(buf, CSTR_STRING(path), sizeof(buf))) {
+#else
     if (realpath(CSTR_STRING(path), buf)) {
+#endif
         return MakeImmString(buf);
     }
 
@@ -718,7 +908,12 @@
         return Fail;
     }
 
+#ifdef _WIN32
+    // Windows has no file permission bits, so <mode> is ignored
+    res = _mkdir(CSTR_STRING(pathname));
+#else
     res = mkdir(CSTR_STRING(pathname), INT_INTOBJ(mode));
+#endif
     if (res < 0) {
         SySetErrorNo();
         return Fail;
@@ -758,8 +953,12 @@
     AssPRec(rec, RNamName("gid"), ObjInt_UInt(statbuf->st_gid));
     AssPRec(rec, RNamName("rdev"), ObjInt_UInt8(statbuf->st_rdev));
     AssPRec(rec, RNamName("size"), ObjInt_Int8(statbuf->st_size));
+#ifdef HAVE_STRUCT_STAT_ST_BLKSIZE
     AssPRec(rec, RNamName("blksize"), ObjInt_Int8(statbuf->st_blksize));
+#endif
+#ifdef HAVE_STRUCT_STAT_ST_BLOCKS
     AssPRec(rec, RNamName("blocks"), ObjInt_Int8(statbuf->st_blocks));
+#endif
     AssPRec(rec, RNamName("atime"), ObjInt_Int(statbuf->st_atime));
     AssPRec(rec, RNamName("mtime"), ObjInt_Int(statbuf->st_mtime));
     AssPRec(rec, RNamName("ctime"), ObjInt_Int(statbuf->st_ctime));
@@ -1514,21 +1713,77 @@
 #ifdef HAVE_FORK
 static Obj FuncIO_fork(Obj self)
 {
-    int res;
+    // Make the termination signals a parent may send to stop the child
+    // work even if a program embedding GAP (e.g. julia via GAP.jl) blocks,
+    // ignores, or catches them with handlers depending on threads that do
+    // not survive the fork; any of these would leave the child unkillable
+    // except via SIGKILL. Unblock them, and mirror exec() semantics for
+    // their dispositions: caught becomes default action, SIG_IGN is kept
+    // (it may be deliberate, e.g. SIGHUP under nohup). SIGTERM is reset
+    // unconditionally: stopping children with it is part of IO_fork's
+    // contract (IO_kill, background jobs), and julia sets it to SIG_IGN.
+    //
+    // This must happen BEFORE the fork, restoring the state in the parent
+    // afterwards: a signal sent to a child that has not yet reset its
+    // inherited state would be discarded (SIG_IGN) or misdelivered, so
+    // resetting in the child would leave a race with a fast parent.
+    // The reset state also survives exec, so all this matters for
+    // fork+exec children, too.
+    static const int termsigs[] = { SIGHUP, SIGINT, SIGQUIT, SIGALRM,
+                                    SIGTERM };
+    enum { NUMTERMSIGS = sizeof(termsigs) / sizeof(termsigs[0]) };
+    struct sigaction saved_sa[NUMTERMSIGS];
+    int              saved_sa_ok[NUMTERMSIGS];
+    sigset_t         unblock, saved_mask;
+    size_t           i;
+    int              res;
+
     FuncIO_InstallSIGCHLDHandler(0);
     // Ensure files are flushed before forking
     fflush(0);
+
+    sigemptyset(&unblock);
+    for (i = 0; i < NUMTERMSIGS; i++) {
+        struct sigaction dfl;
+        sigaddset(&unblock, termsigs[i]);
+        saved_sa_ok[i] = (sigaction(termsigs[i], NULL, &saved_sa[i]) == 0);
+        if (!saved_sa_ok[i])
+            continue;
+        if (saved_sa[i].sa_handler == SIG_DFL ||
+            (saved_sa[i].sa_handler == SIG_IGN && termsigs[i] != SIGTERM))
+            continue;
+        memset(&dfl, 0, sizeof(dfl));
+        dfl.sa_handler = SIG_DFL;
+        sigemptyset(&dfl.sa_mask);
+        sigaction(termsigs[i], &dfl, NULL);
+    }
+    sigprocmask(SIG_UNBLOCK, &unblock, &saved_mask);
+
     res = fork();
+
+    if (res != 0) {
+        // In parent (or fork failed): restore the signal state
+        sigprocmask(SIG_SETMASK, &saved_mask, NULL);
+        for (i = 0; i < NUMTERMSIGS; i++) {
+            if (saved_sa_ok[i])
+                sigaction(termsigs[i], &saved_sa[i], NULL);
+        }
+    }
+
     if (res == -1) {
         SySetErrorNo();
         return Fail;
     }
-#if GAP_KERNEL_MAJOR_VERSION >= 6
     if (res == 0) {
-        // In child
+        // In child: the parent's children are not ours
+        numownchildren = 0;
+#if GAP_KERNEL_MAJOR_VERSION >= 6
         InformProfilingThatThisIsAForkedGAP();
-    }
 #endif
+    }
+    else if (!use_sigchld_handler) {
+        RegisterOwnChild(res);
+    }
     return INTOBJ_INT(res);
 }
 #endif
@@ -1654,7 +1909,12 @@
     return Fail;
 }
 
+#ifdef _WIN32
+// mingw declares _environ in stdlib.h
+#define environ _environ
+#else
 extern char ** environ;
+#endif
 
 static Obj FuncIO_environ(Obj self)
 {
@@ -1678,6 +1938,7 @@
     return tmp;
 }
 
+#ifdef HAVE_PIPE
 static Obj FuncIO_pipe(Obj self)
 {
     Obj tmp;
@@ -1694,6 +1955,7 @@
     AssPRec(tmp, RNamName("towrite"), INTOBJ_INT(fds[1]));
     return tmp;
 }
+#endif
 
 static Obj FuncIO_exit(Obj self, Obj status)
 {
@@ -1706,7 +1968,7 @@
     return True;
 }
 
-#ifdef HAVE_FCNTL_H
+#ifdef HAVE_FCNTL
 static Obj FuncIO_fcntl(Obj self, Obj fd, Obj cmd, Obj arg)
 {
     int res;
@@ -1865,6 +2127,17 @@
     }
     return MakeString(name);
 }
+#elif defined(_WIN32)
+// gethostname is part of Winsock; the computer name needs no network setup
+static Obj FuncIO_gethostname(Obj self)
+{
+    char  name[MAX_COMPUTERNAME_LENGTH + 1];
+    DWORD len = sizeof(name);
+    if (!GetComputerNameA(name, &len)) {
+        return Fail;
+    }
+    return MakeString(name);
+}
 #endif
 
 static Obj FuncIO_getenv(Obj self, Obj name)
@@ -1888,8 +2161,14 @@
         SyClearErrorNo();
         return Fail;
     }
+#ifdef _WIN32
+    // _putenv_s always overwrites
+    int res = _putenv_s(CONST_CSTR_STRING(name), CONST_CSTR_STRING(value));
+    (void)overwrite;
+#else
     int res = setenv(CONST_CSTR_STRING(name), CONST_CSTR_STRING(value),
                      overwrite == True);
+#endif
     if (res < 0) {
         SySetErrorNo();
         return Fail;
@@ -1903,7 +2182,12 @@
         SyClearErrorNo();
         return Fail;
     }
+#ifdef _WIN32
+    // assigning the empty value removes the variable
+    int res = _putenv_s(CONST_CSTR_STRING(name), "");
+#else
     int res = unsetenv(CONST_CSTR_STRING(name));
+#endif
     if (res < 0) {
         SySetErrorNo();
         return Fail;
@@ -2095,8 +2379,10 @@
         IO_select, 5, "inlist, outlist, exclist, timeoutsec, timeoutusec"),
 #endif
 
+#ifdef IO_HAVE_SIGCHLD
     GVAR_FUNC(IO_IgnorePid, 1, "pid"),
-#if defined(HAVE_SIGACTION) || defined(HAVE_SIGNAL)
+#endif
+#ifdef IO_HAVE_SIGCHLD
     GVAR_FUNC(IO_WaitPid, 2, "pid, wait"),
 #endif
 
@@ -2108,14 +2394,16 @@
     GVAR_FUNC(IO_execvp, 2, "path, argv"),
     GVAR_FUNC(IO_execve, 3, "path, argv, envp"),
     GVAR_FUNC(IO_environ, 0, ""),
-#ifdef HAVE_SIGNAL
+#ifdef IO_HAVE_SIGCHLD
     GVAR_FUNC(IO_InstallSIGCHLDHandler, 0, ""),
     GVAR_FUNC(IO_RestoreSIGCHLDHandler, 0, ""),
 #endif
 
+#ifdef HAVE_PIPE
     GVAR_FUNC(IO_pipe, 0, ""),
+#endif
     GVAR_FUNC(IO_exit, 1, "status"),
-#ifdef HAVE_FCNTL_H
+#ifdef HAVE_FCNTL
     GVAR_FUNC(IO_fcntl, 3, "fd, cmd, arg"),
 #endif
 
@@ -2147,7 +2435,7 @@
     GVAR_FUNC(IO_getsockname, 1, "fd"),
 #endif
 
-#ifdef HAVE_GETHOSTNAME
+#if defined(HAVE_GETHOSTNAME) || defined(_WIN32)
     GVAR_FUNC(IO_gethostname, 0, ""),
 #endif
 
@@ -2165,6 +2453,13 @@
     // init filters and functions
     InitHdlrFuncsFromTable(GVarFuncs);
 
+    // see "Child reaping strategy" above
+#ifdef HPCGAP
+    use_sigchld_handler = 0;
+#else
+    use_sigchld_handler = !IsUsingLibGap();
+#endif
+
     // return success
     return 0;
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/io-4.10.0/src/pkgconfig.h.in new/io-4.11.0/src/pkgconfig.h.in
--- old/io-4.10.0/src/pkgconfig.h.in    2026-07-14 02:00:00.000000000 +0200
+++ new/io-4.11.0/src/pkgconfig.h.in    2026-09-28 02:00:00.000000000 +0200
@@ -33,6 +33,9 @@
 /* Define to 1 if you have the `fchown' function. */
 #undef HAVE_FCHOWN
 
+/* Define to 1 if you have the `fcntl' function. */
+#undef HAVE_FCNTL
+
 /* Define to 1 if you have the <fcntl.h> header file. */
 #undef HAVE_FCNTL_H
 
@@ -120,12 +123,18 @@
 /* Define to 1 if you have the `opendir' function. */
 #undef HAVE_OPENDIR
 
+/* Define to 1 if you have the `pipe' function. */
+#undef HAVE_PIPE
+
 /* Define to 1 if you have the `readdir' function. */
 #undef HAVE_READDIR
 
 /* Define to 1 if you have the `readlink' function. */
 #undef HAVE_READLINK
 
+/* Define to 1 if you have the `realpath' function. */
+#undef HAVE_REALPATH
+
 /* Define to 1 if you have the `recv' function. */
 #undef HAVE_RECV
 
@@ -186,6 +195,12 @@
 /* Define to 1 if you have the <string.h> header file. */
 #undef HAVE_STRING_H
 
+/* Define to 1 if `st_blksize' is a member of `struct stat'. */
+#undef HAVE_STRUCT_STAT_ST_BLKSIZE
+
+/* Define to 1 if `st_blocks' is a member of `struct stat'. */
+#undef HAVE_STRUCT_STAT_ST_BLOCKS
+
 /* Define to 1 if you have the `symlink' function. */
 #undef HAVE_SYMLINK
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/io-4.10.0/tst/forksignal.tst new/io-4.11.0/tst/forksignal.tst
--- old/io-4.10.0/tst/forksignal.tst    1970-01-01 01:00:00.000000000 +0100
+++ new/io-4.11.0/tst/forksignal.tst    2026-09-28 02:00:00.000000000 +0200
@@ -0,0 +1,40 @@
+gap> START_TEST("forksignal.tst");
+gap> LoadPackage("IO", false);;
+
+# A child created by IO_fork must be terminable via SIGTERM even if the
+# hosting process blocks signals (e.g. julia embedding GAP via GAP.jl):
+# IO_fork resets the child's signal mask. Poll with a bounded timeout so
+# a regression fails instead of hanging.
+gap> p := IO_pipe();;
+gap> pid := IO_fork();;
+gap> if pid = 0 then
+>   # child: close the inherited line-by-line profile/coverage output (GAP
+>   # opens a per-child file; killed by a signal it would stay truncated),
+>   # tell the parent we are ready, then sleep, and exit in case the
+>   # SIGTERM below never arrives
+>   if IsLineByLineProfileActive() then UnprofileLineByLine(); fi;
+>   IO_write(p.towrite, "r", 0, 1);
+>   IO_select([], [], [], 60, 0);
+>   IO_exit(0);
+> fi;
+gap> pid > 0;
+true
+gap> ready := "";;
+gap> IO_read(p.toread, ready, 0, 1);
+1
+gap> IO_kill(pid, IO.SIGTERM);
+true
+gap> ret := false;;
+gap> for i in [1..100] do
+>   ret := IO_WaitPid(pid, false);
+>   if ret <> false then break; fi;
+>   IO_select([], [], [], 0, 100000);
+> od;
+
+# ret = false means the child survived SIGTERM for 10 seconds
+gap> IsRecord(ret) and ret.pid = pid;
+true
+gap> if ret = false then IO_kill(pid, IO.SIGKILL); IO_WaitPid(pid, true); fi;
+gap> IO_close(p.toread);;
+gap> IO_close(p.towrite);;
+gap> STOP_TEST("forksignal.tst", 1);

Reply via email to