Что происходит в Eclipse CDT в Linux, если вы нажимаете кнопку Terminate? - PullRequest
2 голосов
/ 08 сентября 2010

Я думаю, некоторые сигналы будут отправлены процессу. Некоторые или один? Если более одного в каком порядке они происходят?

А что будет, если нажать кнопку «Завершить» и процесс разветвится? А что будет, если процесс запустил другие процессы по системе (...)?

Ответы [ 3 ]

2 голосов
/ 18 сентября 2010

Я не могу быть уверен без проверки, но я был бы удивлен, если бы отправленный сигнал был чем-то иным, чем SIGTERM (или, возможно, SIGKILL, но это было бы немного недружелюбно по отношению к CDT).

Что касается подпроцессов, то зависит от того, что они на самом деле делают. Если они взаимодействуют со своими родительскими процессами по каналу (каким-либо образом, включая чтение своего стандартного вывода), они, вероятно, обнаружат, что эти файловые дескрипторы закрываются или переходят в состояние исключения; если они все равно попытаются использовать fds, им отправят SIGPIPE. Там также может быть SIGHUP.

Если подпроцесс действительно был полностью непересекающимся (закройте все открытые FD, в родительском объекте не было обработчика SIGTERM, который мог бы сказать, что он должен выйти), то он теоретически может продолжать работать. Так создаются процессы демонов.

0 голосов
/ 21 апреля 2015

Кажется, это SIGKILL.SIGSTOP используется GDB для остановки / возобновления.Со страницы signal man:

Сигналы SIGKILL и SIGSTOP не могут быть перехвачены или проигнорированы.

Я попытался отладить следующую программу с помощью eclipse.Нажатие terminate в сеансе Run или pause в сеансе отладки ничего не печатает.Таким образом, это должно быть либо SIGKILL, либо SIGSTOP.

#include <signal.h>
#include <string.h>
#include <unistd.h>

void handler(int sig) {
    printf("\nsig:%2d %s\n", sig, strsignal(sig));
}

int main(int argc, char **argv) {
    int signum;
    int delay;

    if (argc < 2) {
        printf("usage: continue <sleep>\n");
        return 1;
    }

    delay = atoi(argv[1]);

    for (signum = 1; signum < 64; signum++) {
        signal(signum, handler);
    }

    printf("sleeping %d s\n", delay);
    for(;;) {
        sleep(delay);
    }

    return 0;
}
0 голосов
/ 30 марта 2015

Я проверил SIGTERM, SIGHUP, SIGPIPE с кнопкой завершения. Не работает ... Я думаю, это SIGKILL, и это меня очень огорчает! Кроме того, я не нашел хорошего решения для запуска программы с внешней (или встроенного плагина) консоли.

...