// simple approach
$original_id = 56789;
$shortened_id = base_convert($original_id, 10, 36);
$un_shortened_id = base_convert($shortened_id, 36, 10);
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;
}
Для консольного приложения Windows вы хотите использовать SetConsoleCtrlHandler для обработки CTRL + C и CTRL + BREAK.
См. здесь для примера .
Да, это вопрос, зависящий от платформы.
Если вы пишете консольную программу на POSIX, используйте API сигнала (#include & lt; signal.h & gt;).
В приложении WIN32 GUI вы должны обрабатывать сообщение WM_KEYDOWN.
Вы должны поймать сигнал 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;
}
int s
как аргумент.sig_t
сам является типом указателя функции. – Matthew Marshall 10 March 2010 в 17:34printf()
не является безопасным для асинхронного сигнала, поэтому его нельзя использовать внутри обработчика сигнала. – P.P. 28 June 2016 в 11:09