Как убить несколько дочерних процессов

В программе C, имитирующей проблему чтения-записи, я создал несколько дочерних процессов, используя fork(), и каждый дочерний процесс, названный execlp(), и запустил другую программу (читатель или писатель) в окне xterm.

Когда я заканчиваю main(), дети, работающие в xterm, все еще живы. Как мне их прекратить?

Пример кода ниже -

main() {
    while(1) {
    scanf(choice);
    switch(choice) {
        case 1: 
            reader()
            break;
        case 2: 
            writer();
            break;
        default:
            kill(getpgid(getpid()), SIGTERM); // killing the group id
            return 0;
        }
    }

reader() {
    /*
    some semaphore manipulation
    */
    execlp("xterm", "xterm", "-e", "./read", NULL);
    /*
    some semaphore manipulation
    */
    return 0;
    }

writer() {
    /*
    some semaphore manipulation
    */
    execlp("xterm", "xterm", "-e", "./write", NULL);
    /*
    some semaphore manipulation
    */
    return 0;
    }

person Ahor Converse    schedule 20.08.2012    source источник


Ответы (1)


Идентификаторы группы родительского и дочернего должны быть одинаковыми после разветвления, поэтому отправка kill(pid,SIGTERM); должна позаботиться о них (где pid - это идентификатор группы)

как указано cafe в комментарии ниже, kill(0, SIGTERM) отправит сигнал группе процессов текущего процесса

person MimiEAM    schedule 20.08.2012
comment
как определить идентификатор группы? - person Ahor Converse; 20.08.2012
comment
используя getpgid (), дополнительные сведения доступны здесь (linux.die.net/man/3/getpgid) надеюсь, что это поможет - person MimiEAM; 20.08.2012
comment
Я выполнил kill (getpgid (getpid ()), SIGTERM); Но окна xterm все еще открыты, и я все еще могу работать над ними. - person Ahor Converse; 20.08.2012
comment
как выглядят ваши вызовы execlp ()? (более простым решением было бы сохранить список ваших дочерних идентификаторов при создании в родительском элементе, а затем пройти через него и убить каждого из них. - person MimiEAM; 20.08.2012
comment
также вы можете взять здесь первый пример (docstore.mik.ua/ orelly / unix3 / upt / ch24_22.htm) и посмотрите, как это применимо к вашему случаю - person MimiEAM; 20.08.2012
comment
kill(pid, SIGTERM) отправит сигнал одному процессу с PID pid. Чтобы отправить сигнал группе процессов, вам нужно использовать kill(-pid, SIGTERM). В качестве альтернативы вы можете использовать kill(0, SIGTERM) для отправки сигнала группе процессов текущего процесса. - person caf; 20.08.2012
comment
удар ладонью полностью забыл abt kill (0, ...), я обновлю свои ответы, спасибо @caf - person MimiEAM; 20.08.2012