C++信号处理&多线程

信号是一种软件中断,一种向进程传递有关其他进程、操作系统和硬件状态的信息的方法。

信号只是用来通知某进程发生了什么事件,并不给该进程传递任何数据。

先介绍几种之前遇到过的操作:

[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 用于显式地退出一个线程

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值