another way is to use shared memory to have same value visible from each parent and childs process.
this is an example:
$ipckey = IPC_PRIVATE;
$idshm = shmget( $ipckey, 200, 0666 ) || die "\nCreation shared memory failed $! \n";
$statusproc = "00000";
shmwrite( $idshm, $statusproc , 0, 100 ) || die "shmwrite $!";
if ( $pid == 0 )
{
# do what I have to do .............
# end of task
$statusproc = "1";
shmwrite( $idshm, $statusproc , 0, 1 ) || warn "\n\n shmwrite $! \n";
}
else
{
................
# check statusproc from time to time
shmread( $idshm, $statusproc , 0, 1 ) || warn "\n\n shmread $! \n";
if( $statusproc eq "1" ) # the child has ended it's task
| [reply] |
If you are going to use this method, be sure to check for any left over memory segments when done, with ipcs (on linux). These segments are not automatically cleaned up, although some modules may do it for you. To me, it's one of the drawbacks of this form of IPC, especially if your program gets killed before it can clean up, you may have a "zombie-like" shared memory segment (possibly with 777 permissions) floating around in your ram. See forking with Storable and IPC::ShareLite for example.
I'm not really a human, but I play one on earth.
flash japh
| [reply] |
How? vfork is not available from perl.
And anyway, the manual page for the syscall (on Linux) says:
The vfork() function has the same effect as fork(), except that the behaviour is undefined if the process created by vfork() either modifies any data other than a variable of type pid_t used to store the return value from vfork(), or returns from the function in which vfork() was called, or calls any other function before successfully calling _exit() or one of the exec() family of functions.
It doesn't look like a good option!!! | [reply] [d/l] |
| [reply] [d/l] [select] |
What and where is this "vfork" in Perl?
I'm not really a human, but I play one on earth.
flash japh
| [reply] |