Linux&C++(9):进程

linux信号

linux信号单指给进程发送的信息。比如killall 就是杀死进程,其实这个描述并不准确,应该是给程序发送一个信号,让程序自我了断,并不是我们亲自动手。

为什么直接杀死进程不好?

因为直接杀死进程,可以会出现意想不到的bug,最好是在杀死程序后,程序可以自动执行一些善后工作。

signal函数

这就用到了signal函数

sighandler_t signal(int signum, sighandler_t handler);

第一个参数是要处理的信号,第二个参数是接收到了这个信号该怎么做,一般是自定义函数。系统会默认将signum的值传给handler的形参。相当于是重写这个信号的含义。比如:

信号2,代表了信号ctrl+c,表示中断程序。

信号15,代码了killall 可执行文件名 。表示杀死程序,但没加-9

比如下面的实例程序,就是说,当发送断开进程的信号后,就执行EXIT程序。模拟释放资源的过程。

#include <iostream>
#include <unistd.h>
#include <signal.h>
using namespace std;
//这里释放资源
void EXIT(int sig)
{
  cout << "收到了信号:" << sig << endl;
  cout << "正在释放资源,程序将退出......\n";

  // 以下是释放资源的代码。

  cout << "程序退出。\n";
  exit(0);  // 进程退出。
}

int main(int argc,char *argv[])
{
  // 忽略全部的信号,防止程序被信号异常中止。
  for (int ii=1;ii<=64;ii++) signal(ii,SIG_IGN);

  // 如果收到2和15的信号(Ctrl+c和kill、killall),本程序将主动退出。
  signal(2,EXIT);  signal(15,EXIT);

  while (true)
  {
    cout << "执行了一次任务。\n";
    sleep(1);
  }
}

 当按下ctrl+c后,打印释放资源

当在克隆界面输入killall 可执行文件名后

也成功释放了资源。

当然killall -9 名字

这个命令是不能被改动的,因为这是一个底线,这个信号相当于是皇帝诏令,不能对其有任何抵抗,直接杀死进程。

这里2,代表了信号ctrl+c,表示中断程序。

这里的15,代码了killall 可执行文件名 。表示杀死程序,但没加-9

这就是signal函数的使用原则,一般在主函数内部刚开始就执行了 ,相当于只用声明一次。


通过哪个指令来发送信号?

killall -信号代码 可执行文件名

 是不是很可笑,就是用killall来实现发送信号killall 相当于一个载体,默认载15,可以自己设置值。

查看进程是否还活着?

通过

killall -0 可执行文件名

运行后,如果程序已经死了,就报错,反之,则什么都不显示。 

进程终止函数 

return

返回函数,并不算是进程终止,如果是在主函数里面,那就算是终止函数,如果是在函数内部,那么就只是结束本函数,然后返回上一级继续执行。

exit(0)

这个就是终止函数,只要程序运行到这里,马上停止运行,相当于被杀死了。

查看进程终止状态

查看进程终止的状态:echo $?

如果是异常退出,则是非零,如果是正常退出则是0

析构函数被进程强行终止

如果在函数体内部就使用exit(0),那么类的析构函数可能没有被调用,继而导致类的内存没有被释放。但是exit(0)函数在使用后还是会做一些清理,比如释放缓存等等。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值