diff -up ksh-20100621/src/cmd/ksh93/sh/jobs.c.jobfix002 ksh-20100621/src/cmd/ksh93/sh/jobs.c --- ksh-20100621/src/cmd/ksh93/sh/jobs.c.jobfix002 2012-11-02 14:38:16.001706540 +0100 +++ ksh-20100621/src/cmd/ksh93/sh/jobs.c 2012-11-02 14:41:16.846287794 +0100 @@ -305,11 +305,14 @@ int job_reap(register int sig) pid = waitpid((pid_t)-1,&wstat,flags&=~WCONTINUED); sh_sigcheck(); if(pid<0 && errno==EINTR && (sig||job.savesig)) + { + errno=0; continue; + } if(pid<=0) break; - /*if(pid==0) - job_chksave(pid);*/ + if(wstat==0) + job_chksave(pid); flags |= WNOHANG; job.waitsafe++; jp = 0; @@ -344,6 +347,10 @@ int job_reap(register int sig) pw->p_flag &= ~(P_NOTIFY|P_SIGNALLED|P_STOPPED); else if(WIFSTOPPED(wstat)) { + pw->p_flag |= (P_NOTIFY|P_SIGNALLED|P_STOPPED); + pw->p_exit = WSTOPSIG(wstat); + if(pw->p_pgrp && pw->p_pgrp==job.curpgid && sh_isstate(SH_STOPOK)) + kill(getpid(),pw->p_exit); if(px) { /* move to top of job list */ @@ -351,10 +358,6 @@ int job_reap(register int sig) px->p_nxtjob = job.pwlist; job.pwlist = px; } - pw->p_flag |= (P_NOTIFY|P_SIGNALLED|P_STOPPED); - pw->p_exit = WSTOPSIG(wstat); - if(pw->p_pgrp && pw->p_pgrp==job.curpgid && sh_isstate(SH_STOPOK)) - sh_fault(pw->p_exit); continue; } else @@ -1860,14 +1863,14 @@ void job_fork(pid_t parent) jobfork++; break; case 0: + jobfork=0; job_unlock(); - jobfork--; job.waitsafe = 0; job.in_critical = 0; break; default: - jobfork--; -// job_chksave(parent); + job_chksave(parent); + jobfork=0; job_unlock(); break; }