When using these scripts: """ $ cat p1 #!/bin/ksh while true do echo -n "Exit (y/n)? " 1>&2 read V if [ "${V}" = "y" ] then exit 1 fi sleep 1 done """ and """ $ cat p2 #!/bin/ksh sleep 1 exit """ if run as: """ $ ./p1|./p2 """ it will hang, most times, if the current shell is ksh. But will work with other *sh shells. If it does not hang at first, please try this: """ $ taskset 1 ksh $ ./p1 | ./p2 """ Attaching gdb shows it keeps receiving two SIGTTIN followed by a SIGCONT. I believe this is related to https://bugzilla.redhat.com/show_bug.cgi?id=1311682 [Problem with pipes implemented using unix sockets]
I tested with a ksh built to use real pipes instead of sockets. The problem still happens. In gdb the same behaviour; when it works, it will block waiting for input in the select call in src/lib/libast/sfio/sfpkrd.c:sfpkrd(), but if it blocks in src/cmd/ksh93/edit/edit.c:ed_read() in the read call in the chunk: while(1) { rv = read(fd,buff,size); if(rv>=0 || errno!=EINTR) break; if(shp->trapnote&(SH_SIGSET|SH_SIGTRAP)) goto done; /* an interrupt that should be ignored */ fixtime(); } the problem happens. Using real pipes only fixed another test, running it as: yes | ./p1 | ./p2 forcing it to SIG_IGN TTIN, TTOU or CONT signals causes the process to keep running after the parent process dies. For example, running "call signal(SIG, 1)" in gdb, with SIG being 18, 21 and/or 22.
Created attachment 1285074 [details] ksh-20120801-jobwait-sigstop.patch
https://www.mail-archive.com/ast-developers@lists.research.att.com/msg01961.html
https://github.com/att/ast/pull/44
Since the problem described in this bug report should be resolved in a recent advisory, it has been closed with a resolution of ERRATA. For information on the advisory, and where to find the updated files, follow the link below. If the solution does not work for you, open a new bug report. https://access.redhat.com/errata/RHBA-2018:0801