Вопрос Что произойдет, если я нахожу ctrl-c на терминале [закрыто]


Я получил эту программу, которую прислал мне мой друг. И оба были новыми в ubuntu, и она спросила меня, что произойдет, если мы введем ctrl-c на терминал

#include <signal.h>
#include <stdio.h>

void catch(int signo) {
    printf("Signal %d caught\n", signo);
    sleep(2);
}

int main() {
    int i;
    struct sigaction act;
    act.sa_flags = 0;
    act.sa_handler = catch;
    sigfillset(&(act.sa_mask));
    if (sigaction(SIGINT, &act, NULL) != 0) {
        perror("sigaction");
        exit(1);
    }
    for (i = 0; i < 100; ++i) {
        printf("sleep %d ....\n", i);
        sleep(1);
    }
    exit(0);
}

1
2018-04-10 10:06


происхождения


Почему бы вам просто не попробовать? - Melebius
askubuntu.com/questions/890591/... - luv.preet
компилировать, ссылаться, запускать, вводить <ctrl-c> смотреть, что происходит. - user3629249
опубликованный код не компилируется. в нем отсутствует утверждение: #include <unistd.h> для sleep() функции отсутствует инструкция: #include <stdlib.h> для exit() функция - user3629249
для удобства чтения и понимания, 1) последовательно отступать от кода. отступ после каждой открывающей скобки '{'. unindent перед каждой закрывающей скобкой '}'. Предложите использовать 4 пробела для каждого уровня отступа. 2) отдельные блоки кода (для if, else, while, do ... while, switch, case, default) через одну пустую строку - user3629249


ответы:


Что произойдет:

  • ваш терминал отправит SIGINT (прерывание)
  • ваш процесс перехватит сигнал и передаст его числовое значение 2 на ваш catch функция, которая будет печатать Signal 2 caught
  • перехватив и обработав сигнал, программа продолжит основной цикл печати / сна

Например

sleep 0 ....
sleep 1 ....
sleep 2 ....
sleep 3 ....
sleep 4 ....
^CSignal 2 caught
sleep 5 ....
sleep 6 ....
sleep 7 ....

Вы сможете убить программу, отправив SIGKILL сигнал, например. путем приостановки процесса с использованием CtrlZ и затем набрав pkill myprog (где myprog это имя вашей скомпилированной исполняемой версии кода).

The signals SIGKILL and SIGSTOP cannot be caught, blocked, or ignored.

Видеть man 7 signal для получения дополнительной информации о сигналах и обработке сигналов.


6
2018-04-10 12:26





Control+C (control character intr) отправляет SIGINT, который прервет приложение. Обычно вызывает его прерывание, но это зависит от приложения, которое нужно решить.


0
2018-04-10 11:10