Russian Qt Forum

Qt => Многопоточное программирование, процессы => Тема начата: Павелъ от Февраль 20, 2018, 15:31



Название: QProcess::kill() не убивает дочерние процессы
Отправлено: Павелъ от Февраль 20, 2018, 15:31
Доброго времени суток.

Выполняю bash-скрипт в QProcess()

Код:
_proc->setProgram("/bin/bash");

    _proc->setArguments(QStringList() << "-c" << "nmap -sP " + _address + ".0/24 | grep -E -o \"[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}$\" | awk -F \".\" '{ if(($4 > 0) && ($4 < 255)) print $0;}'");


При удалении элемента требуется сразу закрыть процесс. Самым быстрым способом является - kill.

Но, он убивает только /bin/bash, а nmap продолжает висеть пока не выполнится.

Почему так происходит? Если я открою какое-нибудь графическое приложение в терминале и закрою терминал, то графическое приложение тоже закрывается.

Что не так с killом в данном случае?

Пробовал и так:
Код:
    int PID = _proc->pid();


    qDebug() << "PID=" << _address << PID;

    if(PID)
    {       
        QProcess::startDetached("/bin/bash",QStringList() << "-c" << "kill " + QString::number(PID));
    }

Тоже ничего не работает.

Как удалить полностью процесс, запущенный в QProcess, чтобы и bash, и nmap, и grep, и awk удалились?

Можно killall сделать, но вдруг другая программа использует nmap, то тогда и он закроется.


Название: Re: QProcess::kill() не убивает дочерние процессы
Отправлено: Павелъ от Февраль 20, 2018, 15:38


Почему так происходит? Если я открою какое-нибудь графическое приложение в терминале и закрою терминал, то графическое приложение тоже закрывается.



Не обратил внимание, что если убить bash, то графическое приложение не закрывается. Закрывается только при ЗАКРЫТИИ терминала.

Значит, при закрытии прописано какое-то правило, которое удаляет всех потомков.


Название: Re: QProcess::kill() не убивает дочерние процессы
Отправлено: qate от Февраль 21, 2018, 09:25
https://stackoverflow.com/questions/392022/whats-the-best-way-to-send-a-signal-to-all-members-of-a-process-group