网站建设自查情况报告,莘庄做网站,wordpress口语主题,企业管理培训课程学习C 信号处理
目录
C 信号处理
signal() 函数
实例
raise() 函数
实例 信号是由操作系统传给进程的中断#xff0c;会提早终止一个程序。在 UNIX、LINUX、Mac OS X 或 Windows 系统上#xff0c;可以通过按 CtrlC 产生中断。
有些信号不能被程序捕获#xff0c;但是下表…C 信号处理
目录
C 信号处理
signal() 函数
实例
raise() 函数
实例 信号是由操作系统传给进程的中断会提早终止一个程序。在 UNIX、LINUX、Mac OS X 或 Windows 系统上可以通过按 CtrlC 产生中断。
有些信号不能被程序捕获但是下表所列信号可以在程序中捕获并可以基于信号采取适当的动作。这些信号是定义在 C 头文件 csignal 中。
信号描述SIGABRT程序的异常终止如调用 abort。SIGFPE错误的算术运算比如除以零或导致溢出的操作。SIGILL检测非法指令。SIGINT程序终止(interrupt)信号。SIGSEGV非法访问内存。SIGTERM发送到程序的终止请求。
signal() 函数
C 信号处理库提供了 signal 函数用来捕获突发事件。以下是 signal() 函数的语法 void (*signal (int sig, void (*func)(int)))(int); 这个看起来有点费劲以下语法格式更容易理解
signal(registered signal, signal handler)这个函数接收两个参数第一个参数是一个整数代表了信号的编号第二个参数是一个指向信号处理函数的指针。
让我们编写一个简单的 C 程序使用 signal() 函数捕获 SIGINT 信号。不管您想在程序中捕获什么信号您都必须使用 signal 函数来注册信号并将其与信号处理程序相关联。看看下面的实例
实例
#include iostream
#include csignal
#include unistd.husing namespace std;void signalHandler( int signum )
{cout Interrupt signal ( signum ) received.\n;// 清理并关闭// 终止程序 exit(signum); }int main ()
{// 注册信号 SIGINT 和信号处理程序signal(SIGINT, signalHandler); while(1){cout Going to sleep.... endl;sleep(1);}return 0;
}当上面的代码被编译和执行时它会产生下列结果 Going to sleep....
Going to sleep....
Going to sleep....现在按 CtrlC 来中断程序您会看到程序捕获信号程序打印如下内容并退出 Going to sleep....
Going to sleep....
Going to sleep....
Interrupt signal (2) received.raise() 函数
您可以使用函数 raise() 生成信号该函数带有一个整数信号编号作为参数语法如下 int raise (signal sig);在这里sig 是要发送的信号的编号这些信号包括SIGINT、SIGABRT、SIGFPE、SIGILL、SIGSEGV、SIGTERM、SIGHUP。以下是我们使用 raise() 函数内部生成信号的实例
实例
#include iostream
#include csignal
#include unistd.husing namespace std;void signalHandler( int signum )
{cout Interrupt signal ( signum ) received.\n;// 清理并关闭// 终止程序 exit(signum); }int main ()
{int i 0;// 注册信号 SIGINT 和信号处理程序signal(SIGINT, signalHandler); while(i){cout Going to sleep.... endl;if( i 3 ){raise( SIGINT);}sleep(1);}return 0;
}当上面的代码被编译和执行时它会产生下列结果并会自动退出 Going to sleep....
Going to sleep....
Going to sleep....
Interrupt signal (2) received.