send SIGINT to child process

ThP picture ThP · Nov 19, 2009 · Viewed 9.5k times · Source

I am trying to create a child process and then send SIGINT to the child without terminating the parent. I tried this:

pid=fork();
  if (!pid)
  {
      setpgrp();
      cout<<"waiting...\n";
      while(1);
  }
  else
      {
      cout<<"parent";
      wait(NULL);
      }

but when I hit C-c both process were terminated

Answer

paxdiablo picture paxdiablo · Nov 19, 2009

Don't use CTRL-C, this sends a signal to all processes with the same controlling terminal (ie, in the same session). That's something that setpgid doesn't change though I think there's a setsid (set session ID) call for that purpose.

The easiest solution is simply to target the specific process rather than a session. From the command line:

kill -INT pid

From C:

kill (pid, SIGINT);

where pid is the process ID you want to send the signal to.

The parent can get the relevant PID from the return value from fork(). If a child wants its own PID, it can call getpid().