On Fri, 13 May 2005, Hervé Kergourlay wrote:

Seán C. Farley a écrit :

On Thu, 12 May 2005, Seán C. Farley wrote:

On Thu, 12 May 2005, Hervé Kergourlay wrote:

<snip>

4) wait() API

2 problems, the first is a ECHILD error on a wait call after a fork
fork The code is generic for most of unix system. Is there any
specific problems to manage the fork and wait APIs ?  the second
problem with calls is a blocking wait() call in the same condition
but this time the son process is finished but the wait call in the
father stays blocked, again it's a generic Unix code

If there is no evidence, ask me for more informations


The second problem sounds like what I am encountering
(http://www.freebsd.org/cgi/query-pr.cgi?pr=77818) with zsh for my
shell.  You did suspend (sigsuspend()) SIGCHLD before the fork?  By
"fork fork", do you mean you fork twice?


Ah ha!  I see the problem that has been causing me this problem and
probably you too.  Signal suspensions (only these?) are not being
copied with a double fork().  Here is an example program[1] to
illustrate.  They do get copied on FreeBSD-4.10 and Linux.  I just do
not know if they are supposed to be copied.

Seán

P.S.  I included David since he has been trying to help me with this
bug.

1. http://www.farley.org/freebsd/tmp/grandparent.c


I test your sample

it's working on Linux and FreeBSD 4.0 but failing on FreeBDS 5.2 et
5.3.  the process stays blocked on the suspend call

I rewrite another sample with the same model, joined here, as we wrote
it in our main program. It's working also on Linux but failing on all
FreeBSD included FreeBSD 4.0, 5.2 et 5.3

trace when working

avant FORK : pid 71995.
avant FORK : pid 71996.
son pid 71997.
Child calling execve(/bin/ls).
sigw    sigw.c  sigw2   sigw2.c
Grand parent pid 71996.
Grand parent waiting for a signal.
Parent pid 71997.
Parent waiting for a signal.
Parent get status 100000.
Grand parent get status 100000.

trace when failing

avant FORK : pid 71995.
avant FORK : pid 71996.
son pid 71997.
Child calling execve(/bin/ls).
sigw    sigw.c  sigw2   sigw2.c
Grand parent pid 71996.
Grand parent waiting for a signal.
Parent pid 71997.
Parent waiting for a signal.
wait returned No child processes.
wait returned No child processes.

the wait call return with an errno ECHILD ??

The children are exiting before the parents (due to sleep()'s) get to their wait()'s.

did you have any idea if the problem will be solve by the FreeBSD team
or not ?

I updated my bug report and tried to notify David Xu but the e-mail server rejected the e-mail (too many "Received" headers). I am also Cc'ing Greg Lehey since he ran into a possibly similar bug[1] in February.

or if there is a workarouund ?

Reapplying the sigsuspend() before each fork() may work.

Seán
  1. http://www.freebsd.org/cgi/query-pr.cgi?pr=kern/77537
--
[EMAIL PROTECTED]
_______________________________________________
freebsd-hackers@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
To unsubscribe, send any mail to "[EMAIL PROTECTED]"

Reply via email to