Убить приложение C ++ в терминале, деструктор не вызван? [Дубликат]

// simple approach

$original_id = 56789;

$shortened_id = base_convert($original_id, 10, 36);

$un_shortened_id = base_convert($shortened_id, 36, 10);
105
задан Bugfinger 8 June 2016 в 14:03
поделиться

4 ответа

signal не самый надежный способ, поскольку он отличается в реализациях. Я бы рекомендовал использовать sigaction. Код Tom теперь будет выглядеть следующим образом:

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

void my_handler(int s){
           printf("Caught signal %d\n",s);
           exit(1); 

}

int main(int argc,char** argv)
{

   struct sigaction sigIntHandler;

   sigIntHandler.sa_handler = my_handler;
   sigemptyset(&sigIntHandler.sa_mask);
   sigIntHandler.sa_flags = 0;

   sigaction(SIGINT, &sigIntHandler, NULL);

   pause();

   return 0;    
}
139
ответ дан auselen 20 August 2018 в 10:28
поделиться
  • 1
    Я думаю, что my_handler должен принимать int s как аргумент. sig_t сам является типом указателя функции. – Matthew Marshall 10 March 2010 в 17:34
  • 2
    & lt; stdlib.h & gt ;, и т. д. - это C, а не C ++. В C ++ вы должны использовать & lt; cstdlib & gt; – Abyx 19 September 2010 в 12:59
  • 3
    Работает на OSX. В моем файле main.mm мне даже не нужно было включать signal.h, stdlib.h или unistd.h. Я просто включил stdio.h и Foundation / Foundation.h, а затем, если мне нужно было делать std :: cout для вывода сообщения о завершении работы, я включил iostream. – Volomike 31 March 2016 в 18:03
  • 4
    printf() не является безопасным для асинхронного сигнала, поэтому его нельзя использовать внутри обработчика сигнала. – P.P. 28 June 2016 в 11:09
  • 5
    Эти функции недоступны в Windows. – Timmmm 29 May 2017 в 12:32

Для консольного приложения Windows вы хотите использовать SetConsoleCtrlHandler для обработки CTRL + C и CTRL + BREAK.

См. здесь для примера .

43
ответ дан Fabrizio 20 August 2018 в 10:28
поделиться

Да, это вопрос, зависящий от платформы.

Если вы пишете консольную программу на POSIX, используйте API сигнала (#include & lt; signal.h & gt;).

В приложении WIN32 GUI вы должны обрабатывать сообщение WM_KEYDOWN.

1
ответ дан Nathan Osman 20 August 2018 в 10:28
поделиться

Вы должны поймать сигнал SIGINT (мы говорим POSIX правильно?)

См. ответ @Gab Royer для сигментации.

Пример :

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

void my_handler(sig_t s){
           printf("Caught signal %d\n",s);
           exit(1); 

}

int main(int argc,char** argv)
{
   signal (SIGINT,my_handler);

   while(1);
   return 0;

}
24
ответ дан Tom 20 August 2018 в 10:28
поделиться
  • 1
    Да, это POSIX. Я забыл добавить Linux к вопросу. – Scott 29 October 2009 в 02:42
  • 2
    signal () ведет себя по-разному, в зависимости от того, соответствует ли BSD или SysV-стиль. sigaction () является предпочтительным. – asveikau 29 October 2009 в 02:49
  • 3
    Да, этот код не работал для меня. sigaction сделал. – Matt 17 January 2011 в 11:49
Другие вопросы по тегам:

Похожие вопросы: