Hello,
I think there is a bug in fork in windows server 2003 64-Bit on an IA64 Platform (Itanium 2).
I tried these perls: ActiveState 5.8, Stable 5.8, Developer 5.9
The code affected is:
if ($pid=fork()) {
#mainprog
}
else {
exec "perl $0"; #start my prog again and "close" the child immediatly
}
I use this code to generate multiple sessions on a database (it's part of my diploma thesis).
PROBLEM:
The exec also kills the #mainprog section.
The code works fine and as expected under Suse Linux 8.0, 8.1, 8.2, HP-UX 11.20, 11.22, 11.23, Windows XP Professional SP1.
I would prefer exec rather than system because I want totally independent instances of my testscript (Many different users do many different actions). For me that's the only way to do it ( or you tell me how to fork up to 500 instances).
I also tried to encapsulate the exec in a "sub restart" and to start this as a thread (use thread, thread->new...), but it has the same effect, even if I additionally fork in that sub:
Sub restart {
if ($pid=fork()) {
return; } #ok, that's unorthodox, but it worked
else {exec $0; }
}
$t=Thread->new(\&restart)
Mit freundlichen Grüßen/ Kind regards
Tobias Beissinger
Siemens VDO Automotive AG
SV IO ML
RbgS/O10/2/A15.1
Tel.: 0941/ 790 - 9823
I don't "do" Windows, so the following comments are speculative.
Since Windows doesn't support fork() at the OS level, Perl has to
emulate it by creating additional threads in the main process. In UNIX
at least, exec() replaces the whole process, not just the current thread,
and if Window's exec() behaves similarly, then that would explain what you
are seeing. However, I'm slightly puzzled by the fact that you claim
XP works. Any Windows experts here want to comment?
Dave.
--
Monto Blanco... scorchio!
My expertise is rusting rapidly, but AFAIK to fake fork you need threads.
The win32/makefile* have comments to that effect, and I believe that is
the default these days.
I don't see how it can work on XP.
Note that cygwin pseudo-OS has its own fork() faking...