Porting on FreeBSD 53
Seán C. Farley
sean-freebsd at farley.org
Fri May 13 10:45:15 PDT 2005
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
--
sean-freebsd at farley.org
More information about the freebsd-hackers
mailing list