From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from pantransit.smar.reptiles.org ([198.96.117.26]) by hawkwind.utcs.utoronto.ca with SMTP id <24656>; Thu, 5 Feb 1998 16:40:00 -0500 Received: (qmail 12465 invoked by uid 204); 5 Feb 1998 05:01:30 -0000 Date: Thu, 5 Feb 1998 00:01:30 -0500 Message-ID: <19980205050130.12464.qmail@pantransit.smar.reptiles.org> From: smarry@pantransit.smar.reptiles.org To: broman@nosc.mil, culliton@clark.net Subject: Re: "rc" shell maintainer? Cc: debian-devel@lists.debian.org, rc@hawkwind.utcs.toronto.edu Hello, this is Marc Moorcroft. I joined the list shortly after running into two problems with rc-1.5b2 under Linux. One definite bug (reported to Tim Goodwin) will cause rc to spin calling wait(2) if you do: {ls & wait} | cat There is another problem with signal handling that is a little more complicated. When I upgraded to the 2.0.33 kernel, rc began hanging occasionally when I interrupted programs, and when I finally got irritated enough to check it thoroughly, I found that it failed trip.rc at: kill -2 $pid The relevant code is rc_wait() in wait.c: static pid_t rc_wait(int *stat) { int r; interrupt_happened = FALSE; if (!setjmp(slowbuf.j)) { slow = TRUE; if (!interrupt_happened) r = wait(stat); else r = -1; } else r = -1; slow = FALSE; return r; } It appears that some of the time, Linux will return from the wait(2) for the 'kill' process before the signal gets delivered. On Linux installations where signal(2) has the System V behaviour (system calls are interrupted for signals that are caught via signal(2)) rc longjmps out of the signal handler (a rather alarming practice in itself) to the top of the enclosing code in rc_wait(). The sequence of events appears to be: The signal is sent, the process exits, wait(2) returns successfully, and before the longjmp gadgetry can be turned off (slow = FALSE), the signal handler IMMEDIATELY runs, longjmps back to the top of the setjmp block, and the PID that wait(2) returned is lost. rc loops forever calling wait(2) with no children, waiting for the lost PID to turn up. I've talked to others who have had different problems on other Linux installations, where caught signals do not interrupt system calls, as in BSD. This appears to be due to a difference of opinion between the libc and glibc people about how signals should behave, but I haven't investigated it myself.