How can I catch a ctrl-c event?
signal
isn't the most reliable way as it differs in implementations. I would recommend using sigaction
. Tom's code would now look like this :
#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;
}
Ctrl + C interrupt event handling in Linux
When you press Ctr + C, the operating system sends a signal to the process. There are many signals and one of them is SIGINT. The SIGINT ("program interrupt") is one of the Termination Signals.
There are a few more kinds of Termination Signals, but the interesting thing about SIGINT is that it can be handled (caught) by your program. The default action of SIGINT is program termination. That is, if your program doesn't specifically handle this signal, when you press Ctr + C your program terminates as the default action.
To change the default action of a signal you have to register the signal to be caught. To register a signal in a C program (at least under POSIX systems) there are two functions
- signal(int signum, sighandler_t handler);
- sigaction(int signum, const struct sigaction *act,
struct sigaction *oldact);.
These functions require the header signal.h to be included in your C code. I have provide a simple example of the signal
function below with comments.
#include <stdio.h>
#include <stdlib.h>
#include <signal.h> // our new library
volatile sig_atomic_t flag = 0;
void my_function(int sig){ // can be called asynchronously
flag = 1; // set flag
}
int main(){
// Register signals
signal(SIGINT, my_function);
// ^ ^
// Which-Signal |-- which user defined function registered
while(1)
if(flag){ // my action when signal set it 1
printf("\n Signal caught!\n");
printf("\n default action it not termination!\n");
flag = 0;
}
return 0;
}
Note: you should only call safe/authorized functions in signal handler. For example avoid calling printf in signal handler.
You can compile this code with gcc and execute it from the shell. There is an infinite loop in the code and it will run until you send a SIGINT
signal by pressing Ctr + C.
Catching ctrl+c event in console application (multi-threaded)
Based on your question there are two events you need to catch.
- First there is the console close event which is explained here: "On Exit" for a Console Application
- Second you want to catch control c which is explained here: How do I trap ctrl-c in a C# console app
If you put these two together with your example you get something like this:
static ConsoleEventDelegate handler;
private delegate bool ConsoleEventDelegate(int eventType);
[DllImport("kernel32.dll", SetLastError = true)]
private static extern bool SetConsoleCtrlHandler(ConsoleEventDelegate callback, bool add);
private static MyExternalProcess p1;
public static void Main()
{
Console.CancelKeyPress += delegate
{
killEveryoneOnExit();
};
handler = new ConsoleEventDelegate(ConsoleEventCallback);
SetConsoleCtrlHandler(handler, true);
p1 = new MyExternalProcess();
p1.startProcess();
}
public static void killEveryoneOnExit()
{
p1.kill();
}
static bool ConsoleEventCallback(int eventType)
{
if (eventType == 2)
{
killEveryoneOnExit();
}
return false;
}
For a working ctrl c (fun intended) paste example: http://pastebin.com/6VV4JKPY
Related Topics
How to Concatenate Two Strings in C++
Why Should I Declare a Virtual Destructor For an Abstract Class in C++
Resolution of Std::Chrono::High_Resolution_Clock Doesn't Correspond to Measurements
What New Capabilities Do User-Defined Literals Add to C++
Does C++ Call Destructors For Global and Class Static Variables
Why Is My Integer Math With Std::Pow Giving the Wrong Answer
Is There a _Class_ Macro in C++
Cmake: How to Set Up Source, Library and Cmakelists.Txt Dependencies
What Does "Default" Mean After a Class' Function Declaration
How to Enable Gdb Pretty Printing For C++ Stl Objects in Eclipse Cdt
Representing 128-Bit Numbers in C++
How to Deal With Mutexes in Movable Types in C++
Why Is C++11'S Pod "Standard Layout" Definition the Way It Is
C++ Dll Export: Decorated/Mangled Names
Overload Resolution Failure When Streaming Object Via Implicit Conversion to String