in reply to Re: Executing a process in the background AND getting its pid
in thread Executing a process in the background AND getting its pid

Yes, thank you,

but I don't need to know the pid of the child. The child spawns a new non-perl process (using exec), and it is the pid of this new process I need.

For example, fork starts a new perl process with pid 31238. In this process, exec is called, starting another process with pid 31239. Now my original parent need to know this pid. However, all that is known by the parent is the pid of its child as returned from fork, that is, 31238.

  • Comment on Re^2: Executing a process in the background AND getting its pid

Replies are listed 'Best First'.
Re^3: Executing a process in the background AND getting its pid
by Corion (Patriarch) on Jun 12, 2007 at 07:31 UTC

    exec replaces the current process with the new process. Especially, this means that the PID will remain the same. If your P command really is a shell script that calls the P executable with some additional parameters, you will need to be more crafty about obtaining the PID. If you have the unix toolset available (and you should, if you're doing fork+exec), then you can look for the PID via the ps program, for example. Maybe you can also have your P process log to STDOUT instead of a logfile and use IPC::Open2 or IPC::Open3 or IPC::Run to monitor the logfile.

Re^3: Executing a process in the background AND getting its pid
by Zaxo (Archbishop) on Jun 12, 2007 at 07:32 UTC

    With exec, the new non-perl program simply takes over the calling process and runs under its pid. If the new program forks again, you could get trouble, but that's the new program's responsibility. You need to know its behavior to use it effectively.

    After Compline,
    Zaxo

Re^3: Executing a process in the background AND getting its pid
by naikonta (Curate) on Jun 12, 2007 at 08:22 UTC
    Let's say in another words: You have a Perl program, "A", runs with PID 32237. A forks another process, "B", with PID 31238. So, B is the child process of A. B then exec's another program, "C". Now, C is replacing the process B and using B's PID which is 31238. The original parent, which is "A", needs to know the PID of C. That is 31238. Is it correct?

    Consider this:

    # /tmp/child-child.pl print "I'm exec'd: $$\n";
    Then in the main program (/tmp/main.pl):
    #!/usr/bin/perl use strict; use warnings; print "I'm parent ($0): $$\n"; my $child = fork; defined $child or die "Can't fork: $!\n"; unless ($child) { print "I'm child ($0): $$\n"; exec $^X, '/tmp/child-child.pl'; }
    The output is:
    $ perl /tmp/main.pl I'm parent (/tmp/main.pl): 12499 I'm child (/tmp/main.pl): 12500 I'm exec'd (/tmp/child-child.pl): 12500

    Update: fixed typo


    Open source softwares? Share and enjoy. Make profit from them if you can. Yet, share and enjoy!