-static char *sccsid = "@(#)proc.c 4.3 %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;
#endif
!eq(dcwd->di_name, fp->p_cwd->di_name)) {
; /* print in pjwait */
- } else if ((jobflags & (PTIME|PSTOPPED)) == PTIME)
+ }
+/*
+ else if ((jobflags & (PTIME|PSTOPPED)) == PTIME)
ptprint(fp);
+*/
} else {
if (jobflags&PNOTIFY || adrof("notify")) {
printf("\215\n");
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&(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, "-"))) {
if ((jobflags & PSTOPPED) == 0)
pflush(pp);
- else {
- printf("\n");
- pprint(pp, AREASON|SHELLDIR);
- }
pintr1(0);
/*NOTREACHED*/
}
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);
}
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);