diff options
author | David Greenman <dg@FreeBSD.org> | 1996-06-04 02:46:09 +0000 |
---|---|---|
committer | David Greenman <dg@FreeBSD.org> | 1996-06-04 02:46:09 +0000 |
commit | 78983fc28fdd375dbde72ca614abbd4cd54e81ec (patch) | |
tree | 8d6054a4033487aa9930466be6ca859d9b664bb4 | |
parent | 1b7cb109d3888be4b0aa77aea9b683de24f59719 (diff) |
Notes
-rw-r--r-- | sys/kern/kern_proc.c | 17 | ||||
-rw-r--r-- | sys/kern/kern_sysctl.c | 39 | ||||
-rw-r--r-- | sys/sys/proc.h | 3 |
3 files changed, 52 insertions, 7 deletions
diff --git a/sys/kern/kern_proc.c b/sys/kern/kern_proc.c index 3fa8cf2da8d26..4175417bfb5e6 100644 --- a/sys/kern/kern_proc.c +++ b/sys/kern/kern_proc.c @@ -31,7 +31,7 @@ * SUCH DAMAGE. * * @(#)kern_proc.c 8.4 (Berkeley) 1/4/94 - * $Id: kern_proc.c,v 1.9 1994/10/10 01:00:45 phk Exp $ + * $Id: kern_proc.c,v 1.10 1995/05/30 08:05:37 rgrimes Exp $ */ #include <sys/param.h> @@ -154,6 +154,21 @@ pfind(pid) } /* + * Locate a zombie process by number + */ +struct proc * +zpfind(pid) + pid_t pid; +{ + struct proc *p; + + for (p = zombproc; p != NULL; p = p->p_next) + if (p->p_pid == pid) + return (p); + return (NULL); +} + +/* * Locate a process group by number */ struct pgrp * diff --git a/sys/kern/kern_sysctl.c b/sys/kern/kern_sysctl.c index d1109e22d8b42..3bc26236edb5d 100644 --- a/sys/kern/kern_sysctl.c +++ b/sys/kern/kern_sysctl.c @@ -34,7 +34,7 @@ * SUCH DAMAGE. * * @(#)kern_sysctl.c 8.4 (Berkeley) 4/14/94 - * $Id: kern_sysctl.c,v 1.25.4.4 1996/05/30 01:24:41 davidg Exp $ + * $Id: kern_sysctl.c,v 1.25.4.5 1996/05/31 08:04:10 peter Exp $ */ /* @@ -648,17 +648,24 @@ sysctl_doproc(name, namelen, where, sizep) size_t *sizep; { register struct proc *p; - register struct kinfo_proc *dp = (struct kinfo_proc *)where; - register int needed = 0; - int buflen = where != NULL ? *sizep : 0; + register struct kinfo_proc *dp; + register int needed; + int buflen; int doingzomb; struct eproc eproc; int error = 0; if (namelen != 2 && !(namelen == 1 && name[0] == KERN_PROC_ALL)) return (EINVAL); - p = (struct proc *)allproc; +restart: doingzomb = 0; + p = (struct proc *)allproc; + if (where != NULL) + buflen = *sizep; + else + buflen = 0; + dp = (struct kinfo_proc *)where; + needed = 0; again: for (; p != NULL; p = p->p_next) { /* @@ -703,15 +710,37 @@ again: break; } if (buflen >= sizeof(struct kinfo_proc)) { + pid_t pid = p->p_pid; + fill_eproc(p, &eproc); error = copyout((caddr_t)p, &dp->kp_proc, sizeof(struct proc)); if (error) return (error); + /* + * Since copyout can block, our cached struct proc * may + * no longer be valid. For allproc, restart from the + * beginning if the process no longer exists. For + * zombproc, just stop if it's gone. + */ + if (!doingzomb) { + if (pid && (pfind(pid) != p)) + goto restart; + } else { + if (zpfind(pid) != p) + break; + } error = copyout((caddr_t)&eproc, &dp->kp_eproc, sizeof(eproc)); if (error) return (error); + if (!doingzomb) { + if (pid && (pfind(pid) != p)) + goto restart; + } else { + if (zpfind(pid) != p) + break; + } dp++; buflen -= sizeof(struct kinfo_proc); } diff --git a/sys/sys/proc.h b/sys/sys/proc.h index 9097d0b3c0034..ca485cc5c4562 100644 --- a/sys/sys/proc.h +++ b/sys/sys/proc.h @@ -36,7 +36,7 @@ * SUCH DAMAGE. * * @(#)proc.h 8.8 (Berkeley) 1/21/94 - * $Id: proc.h,v 1.16 1995/02/21 00:37:31 davidg Exp $ + * $Id: proc.h,v 1.17 1995/03/16 18:16:22 bde Exp $ */ #ifndef _SYS_PROC_H_ @@ -262,6 +262,7 @@ struct prochd { int chgproccnt __P((uid_t, int)); struct proc *pfind __P((pid_t)); /* Find process by id. */ +struct proc *zpfind __P((pid_t)); /* Find zombie process by id. */ struct pgrp *pgfind __P((pid_t)); /* Find process group by id. */ void mi_switch __P((void)); void resetpriority __P((struct proc *)); |