-static char *sccsid = "@(#)proc.c 4.1 %G%";
+static char *sccsid = "@(#)proc.c 4.12 (Berkeley) 83/07/01";
#include "sh.h"
#include "sh.dir.h"
#include "sh.proc.h"
-#include <wait.h>
+#include <sys/wait.h>
#include <sys/ioctl.h>
/*
register int pid;
union wait w;
int jobflags;
-#ifdef VMUNIX
- struct vtimes vt;
-#endif
+ struct rusage ru;
if (!timesdone)
timesdone++, times(&shtimes);
loop:
pid = wait3(&w.w_status, (setintr ? WNOHANG|WUNTRACED:WNOHANG),
-#ifndef VMUNIX
- 0);
-#else
- &vt);
-#endif
+ &ru);
if (pid <= 0) {
if (errno == EINTR) {
errno = 0;
time_t oldcutimes, oldcstimes;
oldcutimes = shtimes.tms_cutime;
oldcstimes = shtimes.tms_cstime;
- time(&pp->p_etime);
+ gettimeofday(&pp->p_etime, (struct timezone *)0);
times(&shtimes);
pp->p_utime = shtimes.tms_cutime - oldcutimes;
pp->p_stime = shtimes.tms_cstime - oldcstimes;
} else
times(&shtimes);
-#ifdef VMUNIX
- pp->p_vtimes = vt;
-#endif
+ pp->p_rusage = ru;
if (WIFSIGNALED(w)) {
if (w.w_termsig == SIGINT)
pp->p_flags |= PINTERRUPTED;
pp->p_reason = w.w_termsig;
} else {
pp->p_reason = w.w_retcode;
-#ifdef IIASA
- if (pp->p_reason >= 3)
-#else
if (pp->p_reason != 0)
-#endif
pp->p_flags |= PAEXITED;
else
pp->p_flags |= PNEXITED;
} while((fp = fp->p_friends) != pp);
while(fp->p_pid != fp->p_jobid)
fp = fp->p_friends;
+ if (jobflags&PSTOPPED) {
+ if (pcurrent && pcurrent != fp)
+ pprevious = pcurrent;
+ pcurrent = fp;
+ } else
+ pclrcurr(fp);
if (jobflags&PFOREGND) {
- if (jobflags&PSTOPPED) {
- if (pcurrent && pcurrent != fp)
- pprevious = pcurrent;
- pcurrent = fp;
- } else
- pclrcurr(fp);
if (jobflags & (PSIGNALED|PSTOPPED|PPTIME) ||
#ifdef IIASA
jobflags & PAEXITED ||
#endif
!eq(dcwd->di_name, fp->p_cwd->di_name)) {
- if (jobflags & PSTOPPED)
- printf("\n");
- pprint(fp, AREASON|SHELLDIR);
- } else if ((jobflags & (PTIME|PSTOPPED)) == PTIME)
+ ; /* print in pjwait */
+ }
+/*
+ else if ((jobflags & (PTIME|PSTOPPED)) == PTIME)
ptprint(fp);
+*/
} else {
if (jobflags&PNOTIFY || adrof("notify")) {
printf("\215\n");
if ((jobflags&PSTOPPED) == 0)
pflush(pp);
} else {
- if ((jobflags&PSTOPPED) == 0)
- pclrcurr(fp);
fp->p_flags |= PNEEDNOTE;
neednote++;
}
register struct process *fp;
int jobflags, reason;
+ while (pp->p_pid != pp->p_jobid)
+ pp = pp->p_friends;
fp = pp;
do {
if ((fp->p_flags&(PFOREGND|PRUNNING)) == PRUNNING)
while((fp = (fp->p_friends)) != pp);
if ((jobflags & PRUNNING) == 0)
break;
- sigpause(SIGCHLD);
+ sigpause(sigblock(0) &~ mask(SIGCHLD));
}
sigrelse(SIGCHLD);
if (tpgrp > 0)
ioctl(FSHTTY, TIOCSPGRP, &tpgrp); /* get tty back */
- if (jobflags & PSTOPPED)
- return;
- if ((jobflags&PINTERRUPTED) && setintr &&
+ if ((jobflags&(PSIGNALED|PSTOPPED|PTIME)) ||
+ !eq(dcwd->di_name, fp->p_cwd->di_name)) {
+ if (jobflags&PSTOPPED)
+ printf("\n");
+ pprint(pp, AREASON|SHELLDIR);
+ }
+ if ((jobflags&(PINTERRUPTED|PSTOPPED)) && setintr &&
(!gointr || !eq(gointr, "-"))) {
- pflush(pp);
- pintr();
+ if ((jobflags & PSTOPPED) == 0)
+ pflush(pp);
+ pintr1(0);
/*NOTREACHED*/
}
reason = 0;
loop:
sighold(SIGCHLD);
for (pp = proclist.p_next; pp; pp = pp->p_next)
- if (pp->p_pid && pp->p_pid == pp->p_jobid &&
+ if (pp->p_pid && /* pp->p_pid == pp->p_jobid && */
pp->p_flags&PRUNNING) {
- sigpause(SIGCHLD);
+ sigpause(sigblock(0) &~ mask(SIGCHLD));
goto loop;
}
sigrelse(SIGCHLD);
for (np = proclist.p_next; np; np = np->p_next)
if (np->p_index == i)
goto tryagain;
- pmaxindex = pp->p_index = i;
+ pp->p_index = i;
+ if (i > pmaxindex)
+ pmaxindex = i;
break;
tryagain:;
}
}
pp->p_next = proclist.p_next;
proclist.p_next = pp;
- time(&pp->p_btime);
+ gettimeofday(&pp->p_btime, (struct timezone *)0);
}
padd(t)
if (pp->p_flags&PPTIME && !(status&(PSTOPPED|PRUNNING))) {
if (linp != linbuf)
printf("\n\t");
-#ifndef VMUNIX
- ptimes(pp->p_utime, pp->p_stime, pp->p_etime-pp->p_btime);
-#else
- pvtimes(&zvms, &pp->p_vtimes, pp->p_etime - pp->p_btime);
-#endif
+ { static struct rusage zru;
+ prusage(&zru, &pp->p_rusage, &pp->p_etime,
+ &pp->p_btime);
+ }
}
if (tp == pp->p_friends) {
if (linp != linbuf)
ptprint(tp)
register struct process *tp;
{
- time_t tetime = 0;
-#ifdef VMUNIX
- struct vtimes vmt;
-#else
- time_t tutime = 0, tstime = 0;
-#endif
+ struct timeval tetime, diff;
+ static struct timeval ztime;
+ struct rusage ru;
+ static struct rusage zru;
register struct process *pp = tp;
- vmt = zvms;
+ ru = zru;
+ tetime = ztime;
do {
-#ifdef VMUNIX
- vmsadd(&vmt, &pp->p_vtimes);
-#else
- tutime += pp->p_utime;
- tstime += pp->p_stime;
-#endif
- if (pp->p_etime - pp->p_btime > tetime)
- tetime = pp->p_etime - pp->p_btime;
+ ruadd(&ru, &pp->p_rusage);
+ tvsub(&diff, &pp->p_etime, &pp->p_btime);
+ if (timercmp(&diff, &tetime, >))
+ tetime = diff;
} while ((pp = pp->p_friends) != tp);
-#ifdef VMUNIX
- pvtimes(&zvms, &vmt, tetime);
-#else
- ptimes(tutime, tstime, tetime);
-#endif
+ prusage(&zru, &ru, &tetime, &ztime);
}
/*
register struct process *pp, *np;
register int jobflags = 0;
int pid;
+ char *cp;
extern char *sys_errlist[];
int err = 0;
sighold(SIGINT);
sighold(SIGCHLD);
while (*v) {
- if (**v == '%') {
- np = pp = pfind(*v);
+ cp = globone(*v);
+ if (*cp == '%') {
+ np = pp = pfind(cp);
do
jobflags |= np->p_flags;
while ((np = np->p_friends) != pp);
case SIGTTIN:
case SIGTTOU:
if ((jobflags & PRUNNING) == 0) {
- printf("%s: Already stopped\n", *v);
+ printf("%s: Already stopped\n", cp);
err++;
goto cont;
}
killpg(pp->p_jobid, signum);
if (signum == SIGTERM || signum == SIGHUP)
killpg(pp->p_jobid, SIGCONT);
- } else if (!digit(**v))
+ } else if (!digit(*cp))
bferr("Arguments should be jobs or process id's");
else {
- pid = atoi(*v);
+ pid = atoi(cp);
if (kill(pid, signum) < 0) {
printf("%d: ", pid);
printf("%s\n", sys_errlist[errno]);
kill(pid, SIGCONT);
}
cont:
+ xfree(cp);
v++;
}
sigrelse(SIGCHLD);
np->p_flags &= ~PFOREGND;
}
} while((np = np->p_friends) != pp);
+ if (!foregnd)
+ pclrcurr(pp);
pprint(pp, foregnd ? NAME|JOBDIR : NUMBER|NAME|AMPERSAND);
if (foregnd)
ioctl(FSHTTY, TIOCSPGRP, &pp->p_jobid);
}
/*
- * pgetcurr - find a job that is not pp and ``most recent''
+ * pgetcurr - find most recent job that is not pp, preferably stopped
*/
struct process *
pgetcurr(pp)
register struct process *pp;
{
register struct process *np;
+ register struct process *xp = PNULL;
for (np = proclist.p_next; np; np = np->p_next)
if (np != pcurrent && np != pp && np->p_pid &&
np->p_pid == np->p_jobid) {
- return (np);
+ if (np->p_flags & PSTOPPED)
+ return (np);
+ if (xp == PNULL)
+ xp = np;
}
- return (PNULL);
+ return (xp);
}
/*