child process initialization as part of fork() -- STC
Mark Geisert
mark@maxrnd.com
Tue Mar 8 17:55:00 GMT 2016
Sorry for the noise. I had assumed something and posted about it before
checking more thoroughly...
Corinna Vinschen wrote:
> Hi Mark,
>
> On Mar 8 00:20, Mark Geisert wrote:
>> -------- compile, link, and run
>> ~ gcc -nostdlib -pg -g -o stc stc.c build/gcrt0.o build/crt0.o
>> build/libgmon.a build/libcygwin.a /c/Windows/system32/kernel32.dll -lgcc
>>
>> ~ strace -o stc.out --mask=debug+sigp+syscall ./stc
>> 5592: _monstartup called
>> 5592: monstartup called
>> 5592: moncontrol called
>> 5592: profile_off called
>> 5592: profile_on called
>> 5592: _monstartup called <-- this is the odd message I'm asking about
>> 5592: I'm a constructor
>> 5592: I'm the parent
...parent 5592 does the fork() here...
>> 5504: I'm the child
>> 5504: I'm a destructor
>> 5504: _mcleanup called
>> 5504: moncontrol called
>> 5504: profile_off called
>> 5592: I'm a destructor
>> 5592: _mcleanup called
>> 5592: moncontrol called
>> 5592: profile_off called
>>
>> ~
>>
>> In the above compilation command, "build" is a symlink to
>> /oss/build/x86_64-unknown-cygwin/winsup/cygwin/
>>
>> I've patched several routines in Cygwin DLL and libgmon.a to call my note()
>> function just to announce they've been reached and to say what pid they're
>> running in. It looks like libgmon's _monstartup() is called twice, which is
>> expected, but both times in the parent's process, which is not expected.
>
> I'm not set up to test this locally. Can you please check the *Windows*
> PID as well in your note function? There's a chance this is a false
> positive. Dependent on when the constructors are called, the Cygwin
> PID might not be set yet in the child.
I checked Windows pids as well as Cygwin pids and they are 1:1 throughout the
STC. But I've now noticed the 2nd call to _monstartup is being done before
main() is entered in the parent. So it has nothing to do with fork() setting up
the child.
And now that I think about it, fork() copies the "constructed" address space
from parent to child so there should be no need to run constructors again. I
need another mechanism to update libgmon static data and start up a profiling
thread in the child after a fork(). Maybe pthread_atfork() is the way.
..mark
More information about the Cygwin-developers
mailing list