On 03/26/2013 03:23 PM, Chet Ramey wrote: > On 3/25/13 6:45 PM, Pádraig Brady wrote: > >> OK thanks for the pointer. >> So the race is narrowed rather than closed? >> As we have: >> >> execute_disk_command() >> { >> int pid = fork(); >> if (pid == 0) /* child */ >> { >> CHECK_SIGTERM; /* Honor received SIGTERM. */ >> do stuff; >> CHECK_SIGTERM; /* Honor received SIGTERM. */ >> /* --->SIGTERM still ignored if received here?<--- */ >> exec(...); >> } > > Please don't omit the code immediately following the fork that restores > the signal handlers. The execute_disk_command() code actually looks like > this: > > pid = make_child (blah...); > if (pid == 0) > { > reset_terminating_signals (); /* XXX */ > /* Cancel traps, in trap.c. */ > restore_original_signals (); > > CHECK_SIGTERM; > > ... > > exec (blah,...);
Ah that looks good thanks. The two CHECK_SIGTERM; calls in that clause confused me (I'm still not sure both calls are required). In any case I can't see any races now :) > There is code in make_child that resets the sigterm status (RESET_SIGTERM), > since fork() is supposed to clear the set of pending signals anyway. right. > Please see if you can reproduce it with the current devel branch code. I can't. thanks! Pádraig.