[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Problems Forking Around
- To: jeffr@sri-spam
- Subject: Re: Problems Forking Around
- From: weeks%ucbruby.CC@Berkeley (Harry Weeks)
- Date: Sat, 30 Mar 85 02:21:53 GMT
- Cc: franz-friends@Berkeley
- Original-date: Fri, 29 Mar 85 18:21:53 pst
It is a characteristic of Unix that processes do not really die
until they are waited for. Your `zombie' process will not die
until you (wait) for it. The (wait) function returns the dotted
pair (pid . status). Thus the following examples will spawn
children that immediately die.
--Harry
In simplest terms:
(def beget
(lambda nil
(cond ((fork) (wait))
(t (exit 0)))))
In more realistic terms:
(def beget
(lambda nil
(prog (child)
(setq child (fork))
(cond ((null child)
; child branch: (fork) evaluated to nil
(exit 0))
((> child 0)
; parent branch: (fork) evaluated to pid
(princ "Begot ")
(princ child)
(princ ".")
(terpri)
(return (beget:wait child)))
((< child 0)
; error branch
(princ "Birth pain.")
(terpri)
(return child))
(t
; impossible branch
(princ "Impossible pain.")
(terpri)
(return -1))))))
(def beget:wait
(lambda (child)
(prog (pvec)
(setq pvec (wait))
(cond ((= (car pvec) child)
; child we are waiting for died
(return (cdr pvec)))
((< (car pvec) 0)
; error
(princ "Wait error.")
(terpri)
(return (car pvec)))
(t
; another child died, keep waiting for ours
(return (beget:wait child)))))))