On Sat, 29 Sep 2001, Alfred Perlstein wrote:
> * Toshihiko ARAI <[EMAIL PROTECTED]> [010929 11:10] wrote:
> > I consider the following code of system(3).  pid is changed by return
> > value of _wait4().  I feel this need a correction.
> > 
> >         default:                        /* parent */
> >                 do {
> >                         pid = _wait4(pid, &pstat, 0, (struct rusage *)0);
> >                 } while (pid == -1 && errno == EINTR);
> >                 break;
> > 
> > Please review and commit this patch.
> 
> Why does it need to be corrected?  What sort of bad behaviour
> are you seeing?  You do 'a' and you see 'b' when you should
> see 'c'.
> 
> What's a, b and c?
> 

Well, hypothetically (I have no time to attempt to set something up to test
this), it looks to me like:

If you:

1. Fork, and create a child (say, pid 10)
2. Call system, which forks and creates a child (say, pid 11)
3. Make the child (pid 10) exit now.
3. Interrupt the call to _wait4(pid [=11], ...);

You _should_ see nothing happen.  i.e. system() would simply loop again
until the other child exits.

However, what I think you'd see is system() setting pid == -1, calling
_wait4(-1, ...); and _wait4() returning 10, and system() returning whilst
your child is still running happily away.

If I run out of bugs to squash in ircd, I might try to produce this (I
suppose reproduce is the wrong word, since no one has reported it in the
first place...)

-- 
David Taylor
[EMAIL PROTECTED]

Attachment: msg28827/pgp00000.pgp
Description: PGP signature

Reply via email to