linuxprocessprocess-group

How to start a process in its own process group?


I would like to start a process in its own process group (or, alternatively, change its group once started) and:

Note: I tried setsid prog [args] but the processes do not respond to Ctrl+C from the terminal nor I could get the new process group id.

I also tried to change the process group via Perl's setpgrp($pid, $pid) and POSIX::setpgid($pid, $pid), to no avail.

Edit: The larger problem:

I have a process (single-threaded; let's call it the "prolific" process P) that starts many child processes synchronously (one after another; it starts a new one when the previous child process terminates). From the terminal, I want to be able to kill P and the tree of processes below it. To do that, I could simply arrange to kill the processes in P's group. However, the default behavior is that P is in the group of its parent process. That means that P's parent will be killed if I kill all the processes in P's group, unless I have P and its tree be in their own group.

My intention is to kill P and the tree below it, but not P's parent. Also, I cannot modify P's code itself.


Solution

  • What do you mean "start a process in its own process group"? The shell launches processes in their own process groups, that's how it does job control (by having a process group for processes in the foreground, and several process groups for every pipeline launched on the background).

    To see that the shell launches a new process group for every pipeline, you can do this:

    ps fax -o pid,pgid,cmd | less
    

    which will show something like:

    11816 11816  |   \_ /bin/bash
    4759   4759  |       \_ ps fax -o pid,pgid,cmd
    4760   4759  |       \_ less
    

    Note that the shell has created a new process group for the pipeline, and every process in the pipeline shares the process group.

    Edit:

    I think I know what you are getting at. You are calling system from Perl. Apparently, sh -c doesn't create new process groups, since it's a shell without job control.

    What I would do would be to fork, then on the child:

    setpgrp;
    system("ps fax -o pid,pgid,cmd");
    

    and wait on the parent.