LinuxC++(9):进程

news2024/9/30 15:33:50

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)函数在使用后还是会做一些清理,比如释放缓存等等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1979929.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JAVA毕业设计|ssm基于ssm的宠物医院管理系统的设计与实现vue包含文档代码讲解

收藏点赞不迷路 关注作者有好处 文末获取源码 一、系统展示 二、万字文档展示 基于ssm基于ssm的宠物医院管理系统的设计与实现vue 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringSpringMVCMyBatisVue 工具&#xff1a;IDEA/Ecilpse、Navicat、Ma…

SQL注入实例(sqli-labs/less-5)

0、初始页面 1、确定闭合字符 ?id1 and 11 ?id1 and 12 ?id1 ?id1 -- 在进行前两句传参时&#xff0c;页面没有发生任何变化&#xff0c;但是当使用单引号闭合时&#xff0c;报错了。通过报错可以确定闭合符号为单引号。 2、爆库名 ?id1 and updatexml(1,concat(0x7e,(…

腾讯HunyuanDit代码解析

注意&#xff1a;本文仅供自己记录学习过程使用。 训练 全参训练过程 输入图像用VAE编码得到输入的x_start(1,4,128,128)&#xff1b;文本的两个特征&#xff1a;bert的encoder feature(1,77,1024)和T5 的feature(1,256,2048)&#xff0c;和旋转位置编码freqs_cis_img: cos …

4.8.双向循环神经网络

双向循环神经网络 ​ 在序列模型中&#xff0c;我们总是关注之前的信息&#xff0c;并以此来对下一个输出进行预测&#xff0c;但可能未来的信息也很重要&#xff0c;比如文本序列填空&#xff1a; 我___。我___饿了。我___饿了&#xff0c;我可以吃半头猪。 ​ 我们可以分别…

数据安全复合治理与实践

数据安全复合治理与实践 关键要点理论与实践 本文探讨了数据安全复合治理模式的理论与实践&#xff0c;着重强调了在数字经济迅猛发展的背景下&#xff0c;数据安全的重要性以及面对数据安全挑战时所需采取的综合治理策略。首先&#xff0c;文章概述了数据安全治理的必要性&…

使用GPT-4o mini融合GraphRAG技术进行实战应用

什么是gpt-4o mini OpenAI 推出 GPT-4o mini&#xff0c;这是他们最具成本效益的小型模型。它的定价为每百万输入代币 15 美分&#xff0c;每百万输出代币 60 美分&#xff0c;比之前的 Frontier 型号便宜一个数量级&#xff0c;比 GPT-3.5 Turbo 便宜 60% 以上。目前&#xf…

Java 并发编程:一文了解 synchronized 的使用

大家好&#xff0c;我是栗筝i&#xff0c;这篇文章是我的 “栗筝i 的 Java 技术栈” 专栏的第 027 篇文章&#xff0c;在 “栗筝i 的 Java 技术栈” 这个专栏中我会持续为大家更新 Java 技术相关全套技术栈内容。专栏的主要目标是已经有一定 Java 开发经验&#xff0c;并希望进…

练题模块环境搭建

文章目录 1.数据库表设计1.practice_set 套卷2.practice_set_detail 套卷细节3.practice_info 练习信息4.practice_detail 练习详情5.E-R图 2.架构设计&#xff08;三层架构&#xff09;3.练题微服务架构搭建1.创建一个练题微服务模块1.创建一个maven项目2.把src删除&#xff0…

类中特殊变量的初始化

在C的类中有一些变量的初始化需要进行特殊化的处理&#xff0c;这里我将列举出常见的两种特殊类型的变量初始化。 目录 const 类型数据的初始化 代码实例&#xff1a; static类型数据的初始化 代码实例&#xff1a; const 类型数据的初始化 对于const修饰的数据我们需要在…

Robot Operating System——单线程中启动多个Node

在《Robot Operating System——Service的同步/异步通信》一文中&#xff0c;我们介绍了如何实现Service的客户端和服务端。在例子中&#xff0c;它们分别被编译成libadd_two_ints_client_async_library.so和libadd_two_ints_server_library.so&#xff0c;然后分别被可执行程序…

C:将代码拆分放在多个文件的操作

目录 前言&#xff1a; 1、多个文件 2、将一个程序分为多个文件的好处 3、一定程度上对代码进行隐藏 结语&#xff1a; 前言&#xff1a; 在我们刚开始学习C语言时&#xff0c;编写的代码通常比较简短&#xff0c;因此将其放在一个文件中并不会带来不便。然而&#xff0c;…

17965 幸运之星(优先做)

这个问题可以通过使用递归或者迭代的方法来解决。我们可以使用一个一维数组dp来存储中间结果&#xff0c;dp[i]表示i个人时的“幸运之星”的初始编号。 以下是使用C的代码实现&#xff1a; #include <iostream> using namespace std;const int MAXN 1000000; int dp[M…

力扣:100379. 新增道路查询后的最短距离 I(Java,BFS)

目录 题目描述&#xff1a;示例 &#xff1a;代码实现&#xff1a; 题目描述&#xff1a; 给你一个整数 n 和一个二维整数数组 queries。 有 n 个城市&#xff0c;编号从 0 到 n - 1。初始时&#xff0c;每个城市 i 都有一条单向道路通往城市 i 1&#xff08; 0 < i < …

web高可用群集架构部署----超详细

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…

【笔记1-6】Qt bug记录:Qt6 无法使用qsort函数排序

在进行Qt5向Qt6升级的过程中&#xff0c;发现Qt6会编译时会出现以下错误&#xff0c;找不到qsort的定义 一开始以为应该是需要头文件或者.pro文件追加一些配置的问题&#xff0c;但是按照下面的提示追加了两个头文件后也没有效果 再进一步调查&#xff0c;找到了下面的文章&a…

python3 pyside6图形库学习笔记及实践(三)

目录 前言菜单栏相关控件使用QtDesigner快速构建菜单栏结构语法 上下文菜单概念为窗体添加上下文菜单为控件添加上下文菜单 折叠菜单资源的加载内置图标Rcc的使用创建资源文件加载资源文件 前言 本系列文章为b站PySide6教程以及官方文档的学习笔记 原视频传送门&#xff1a;【…

【Linux 17】进程信号

文章目录 &#x1f308; 一、信号的概念⭐ 1. 什么是信号⭐ 2. 常见的信号⭐ 3. 信号的管理 &#x1f308; 二、进程的运行⭐ 1. 进程运行模式⭐ 2. 查看后台进程⭐ 3. 运行后台进程⭐ 4. 终止后台进程 &#x1f308; 三、信号的产生⭐ 1. 通过键盘产生信号⭐ 2. 调用系统函数向…

YiYi-Web项目技术栈介绍

项目地址&#xff1a;https://gitee.com/jack0240/yiyi-web YiYi后台管理系统&#xff08;不分离版&#xff09;&#xff0c;SpringBoot Thymeleaf Layui 后台管理系统框架。 前端技术栈 HTML JavaScript JQuery Layui、Bootstrap Echarts图表、大屏展示、富文本 进阶&#…

书生大模型实战营第三期——入门岛

第一关&#xff1a;Linux基础知识 任务如下&#xff1a; 任务描述闯关任务完成SSH连接与端口映射并运行hello_world.py可选任务 1将Linux基础命令在开发机上完成一遍可选任务 2使用 VSCODE 远程连接开发机并创建一个conda环境可选任务 3创建并运行test.sh文件 1. 使用密码进行…

数据结构——单向链表

目录 前言 一、单向链表 二、单向链表基本操作 1、链表单创建 2.节点插入 &#xff08;1&#xff09;尾部插入 &#xff08;2&#xff09;任意位置插入 3、单向链表节点删除 4、链表打印 5、释放链表 6、链表逆序 ...... 三、链表测试 总结 前言 链表&#xff08;Linked List&a…