在新的进程组中创建所有子进程,然后向该组发送信号。
Edit:
下面是一些最小的代码,显示进程如何使用信号更改其组和控制子进程。
#include <err.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
pid_t pgid; /* process group to kill */
void terminator( int s ) /* signal handler */
{
printf( "[%d:%d] received signal %d, exiting\n",
getpid(), getpgrp(), s );
exit( 1 );
}
int main() /* program entry */
{
printf( "[%d:%d] before first fork\n",
getpid(), getpgrp() );
switch ( fork()) /* try with and without first fork */
{
case -1: err( 1, "fork" );
case 0: break;
default: exit( 0 );
}
if ( signal( SIGTERM, terminator ) == SIG_ERR )
err( 1, "signal" );
if ( setpgrp() < 0 ) err( 1, "setpgrp" );
if (( pgid = getpgrp()) < 0 ) err( 1, "getpgrp" );
printf( "[%d:%d -> %d] before second fork\n",
getpid(), getpgrp(), pgid );
switch ( fork())
{
case -1: err( 1, "fork" );
case 0: /* child */
{
printf( "child [%d:%d]\n", getpid(), getpgrp());
sleep( 20 );
break;
}
default: /* parent */
{
printf( "parent [%d:%d]\n", getpid(), getpgrp());
sleep( 5 );
killpg( pgid, SIGTERM );
sleep( 20 );
}
}
printf( "[%d:%d] exiting\n", getpid(), getpgrp());
exit( 1 );
}