信号是一种软件中断,一种向进程传递有关其他进程、操作系统和硬件状态的信息的方法。
信号只是用来通知某进程发生了什么事件,并不给该进程传递任何数据。
先介绍几种之前遇到过的操作:
[1].在shell中工作希望“杀死所有cat程序”时,使用下列命令:#> killall cat killall命令将向所有名为cat的进程发送一个信号,表示“终止”。发送的实际信号是SIGTERM,其目的是将终止请求传送给给定进程。
[2].在终端中使用crtl+C 产生中断。
这些信号,有些可以在程序中捕获,并可以基于信号采取适当动作,这些信号定义在 C++头文件 <csignal> 中。使用时先要#include <csignal>
每个信号都有一个名称,它以SIG开头,以描述结束
1、信号处理
C++ 信号处理库提供了 signal 函数,用来捕获突发事件:
void signal(registered signal, signal handler) 参数列表:第一个参数是一个整数,代表了信号的编号;第二个参数是一个指向信号处理函数的指针。
例如:
#include <iostream>
#include <csignal>
#include <unistd.h>
using 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....
现在,按 Ctrl+C 来中断程序,您会看到程序捕获信号,程序打印如下内容并退出:
Going to sleep....
Going to sleep....
Going to sleep....
Interrupt signal (2) received
2、生成信号:
可以使用函数 raise() 生成信号,该函数带有一个整数信号编号作为参数
int raise (signal sig);//参数为信号编号
#include <iostream>
#include <csignal>
#include <unistd.h>
using 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.
3、多线程
多线程是多任务处理的一种特殊形式,多任务处理允许让电脑同时运行两个或两个以上的程序。一般情况下,两种类型的多任务处理:基于进程和基于线程。
- 基于进程的多任务处理是程序的并发执行。
- 基于线程的多任务处理是同一程序的片段的并发执行
线程创建:
#include <pthread.h>
pthread_create (thread, attr, start_routine, arg)
终止线程
#include <pthread.h>
pthread_exit (status) // pthread_exit 用于显式地退出一个线程