当前位置: 首页 > news >正文

Linux多进程与信号

在多进程的服务程序中,如果子进程收到退出信号,子进程自行退出。如果父进程收到退出信号,应该先向全部的子进程发送退出信号,然后自己再退出。
演示demo程序

#include <iostream>    // 包含输入输出流库,用于输入输出操作
#include <unistd.h>    // 包含标准的UNIX系统调用库,提供对POSIX操作系统API的访问
#include <signal.h>    // 包含信号处理库,用于处理进程间通信中的信号using namespace std;void FathEXIT(int sig);    // 声明父进程退出处理函数
void ChldEXIT(int sig);    // 声明子进程退出处理函数int main ()
{for(int i = 1; i <= 64; i ++ )signal(i, SIG_IGN);    // 忽略所有信号,防止其他信号中断当前程序的执行signal(SIGTERM, FathEXIT);    // 设置SIGTERM信号的处理函数为FathEXITsignal(SIGINT, FathEXIT);    // 设置SIGINT信号的处理函数为FathEXITwhile(1){if(fork() > 0)    // fork()函数创建子进程,大于0为父进程{sleep(5);    // 父进程等待5秒continue;    // 继续下一次循环}else    // 小于0为子进程{signal(SIGTERM, ChldEXIT);    // 设置SIGTERM信号的处理函数为ChldEXITsignal(SIGINT, SIG_IGN);    // 忽略SIGINT信号while(1){cout << "子进程" << getpid() << "正在运行中。\n";    // 输出子进程的进程IDsleep(3);    // 子进程等待3秒continue;    // 继续下一次循环}}}
}void FathEXIT(int sig)
{signal(SIGINT, SIG_IGN);    // 忽略SIGINT信号signal(SIGTERM, SIG_IGN);    // 忽略SIGTERM信号cout << "父进程退出, sig = " << sig <<endl;    // 输出父进程退出信息kill(0, SIGTERM);    // 向当前进程组的所有进程发送SIGTERM信号,结束进程exit(0);    // 程序正常退出
}void ChldEXIT(int sig)
{signal(SIGINT, SIG_IGN);    // 忽略SIGINT信号signal(SIGTERM, SIG_IGN);    // 忽略SIGTERM信号cout << "子进程" << getpid() << "退出, sig = " << sig << endl;    // 输出子进程退出信息exit(0);    // 程序正常退出
}

这段代码实现了一个父子进程模型,父进程创建子进程,父进程每隔5秒继续循环,子进程每隔3秒输出自身进程ID。

注意:该代码在处理信号时使用了全局变量,不符合良好的编程实践。在实际开发中,应该避免使用全局变量,而是使用更为合适的方式进行进程间通信和信号处理。

http://www.lryc.cn/news/306198.html

相关文章:

  • Self-attention与Word2Vec
  • 【Flutter/Android】运行到安卓手机上一直卡在 Running Gradle task ‘assembleDebug‘... 的终极解决办法
  • 医疗实施-客户需求分析
  • 调度服务看门狗配置
  • AI时代 编程高手的秘密武器:世界顶级大学推荐的计算机教材
  • 【数据结构和算法初阶(c语言)】数据结构前言,初识数据结构(给你一个选择学习数据结构和算法的理由)
  • LeetCode 0235.二叉搜索树的最近公共祖先:用搜索树性质(不遍历全部节点)
  • 【Prometheus】概念和工作原理介绍
  • 四川易点慧电子商务有限公司抖音小店:可靠之选,购物新体验
  • SpringBoot自带的tomcat的最大连接数和最大的并发数
  • TLS1.2抓包解析
  • 使用两个队列实现栈
  • 通过ffmpeg实现视频背景色替换
  • 后轮位置反馈控制与算法仿真实现
  • 实战 vue3 使用百度编辑器ueditor
  • N种方法解决1(CTF)
  • Istio实战:Istio Kiali部署与验证
  • ASPxGridView中使用PopupEditForm表单字段联动填充
  • 基于Pytorch的猫狗图片分类【深度学习CNN】
  • flutter sliver 多种滚动组合开发指南
  • kafka生产者2
  • 【LNMP】云导航项目部署及环境搭建(复杂)
  • nginx之状态页 日志分割 自定义图表 证书
  • 数字人的未来:数字人对话系统 Linly-Talker + 克隆语音 GPT-SoVITS
  • SpringMVC 学习(五)之域对象
  • ✅技术社区项目—JWT身份验证
  • 5.2 Ajax 数据爬取实战
  • 276.【华为OD机试真题】矩阵匹配(二分法—JavaPythonC++JS实现)
  • java——多线程基础
  • Python服务器监测测试策略与工具:确保应用的高可用性!