Попробуйте сделать это в три этапа:
kill(-pid, SIGSTOP);
kill(-pid, SIGTERM);
kill(-pid, SIGCONT);
Первый SIGSTOP должен перевести все процессы в остановленное состояние. Они не могут поймать этот сигнал, поэтому это должно остановить всю группу процессов.
SIGTERM будет поставлен в очередь для процесса, но я не верю, что он будет доставлен, поскольку процессы остановлены (это из памяти, и я не могу найти ссылку, но я верю, что это правда).
SIGCONT снова запустит процессы, позволяя доставить SIGTERM. Если ведомый сначала получает сигнал SIGCONT, мастер все равно может быть остановлен, поэтому он не заметит, что раб уходит. Когда мастер получает SIGCONT, за ним следует SIGTERM, завершающий его.
Я не знаю, будет ли это на самом деле работать, и это может зависеть от реализации, когда все сигналы фактически доставлены (включая SIGCHLD в основной процесс), но это может стоить попробовать.