Невозможно поймать SIGINT, отправленный CLion - PullRequest
0 голосов
/ 04 июля 2018

Я работаю над проектом сетевого программирования с использованием CLion. Поскольку я использую сокеты, если я не закрываю должным образом сокеты и другие сетевые объекты, которые я использую, тогда программа заблокирует порт, и мне придется самому закрывать его, используя командные строки.

Это довольно раздражает, учитывая, что мне придется делать это между каждым тестом. Поэтому я искал способ, которым CLion убивает программу, когда вы нажимаете «стоп», и обнаружил, что она посылает сигнал SIGINT, здесь :

Нажмите эту кнопку, чтобы завершить текущий процесс извне с помощью стандартный скрипт выключения. Нажатие на кнопку один раз вызывает мягкое уничтожение, позволяющее приложению перехватить событие SIGINT и выполнить корректное завершение (в Windows событие Ctrl + C эмулируется). После того, как кнопка нажата один раз, это заменено значком запуска инструмента «Уничтожить окно», указывающим щелчок приведет к принудительному закрытию приложения, например, в Unix SIGKILL отправлено.

Тогда я пытался его поймать, но по некоторым причинам он не работает. Поэтому я попытался создать новый проект, в котором я просто пытаюсь поймать сигнал SIGINT. Вот очень простой нерабочий пример:

#include <iostream>

void signalHandling(int signal)
{
    std::cout << "Signal : " << signal << std::endl;
}

int main() {
    signal(SIGINT, signalHandling);
    while (1)
    {
        ;
    }
}

Все, что я получаю, это: Process finished with exit code 1.

Итак, мой вопрос: почему я не могу поймать этот сигнал, отправленный или, по крайней мере, предполагаемый для отправки CLion?

В случае, если это может быть связано с моей средой, я использую CLion 2018.1.5, мой набор инструментов - Cygwin, и я использую cmake 3.10.3. Я работаю на Windows 10.

1 Ответ

0 голосов
/ 04 июля 2018

Вот что я делаю из справки @ VTT.

Приведенный пример должен работать и фактически работает, когда не используется CLion. Я пытался на терминале на самом деле делать CTRL-C, и это сработало. Моя программа получила сигнал SIGINT.

Таким образом, эта проблема, вероятно, является ошибкой CLion, поскольку кнопка остановки фактически должна имитировать CTRL-C и отправлять сигнал SIGINT.

Я отправил отчет об ошибке команде JetBrain, и буду ждать их возможной обратной связи, и сообщу вам.

Еще раз спасибо @VTT.


РЕДАКТИРОВАТЬ:

Я связался со службой поддержки CLion, и они просто перенаправили меня на другую похожую проблему , написанную другим пользователем CLion. Поэтому я думаю, что они не собираются ничего делать.

После некоторых исследований я перешел к этой проблеме . Почти то же самое, за исключением высказывания о том, что CLion некорректно завершает процессы, как в моем случае.

Видимо, это ошибка из-за скрипта остановки. Я нашел способ заставить CLion действительно завершить процесс.

ВНИМАНИЕ!

Вы должны учитывать, что изменение параметров реестра может быть опасным! Используйте следующее решение на свой страх и риск!

Вот что я сделал:

  • Нажмите на Справку
  • Нажмите «Найти действие»
  • Введите и выберите реестр
  • Снять отметку run.processes.with.pty

Вот и все!

Вы должны знать, что это не позволит вам отлавливать сигнал SIGINT, который должен быть отправлен кнопкой «стоп» на CLion, но он убивает процесс, в отличие от кнопки остановки. Также обратите внимание, что это не фактический ответ на вопрос, но, поскольку я работал над программным проектом, мне пришлось вручную убить свой сервер, чтобы запустить его снова. Так что это решило мою проблему, а также могло бы решить чью-то еще.

...