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

20242817-李臻-课上测试:信号处理

一、实验要求

  1. 在 Ubuntu 或 openEuler 中完成任务(推荐openEuler)
  2. 写一个父子进程通信程序。父进程每2秒向子进程发送SIGUSR2信号。子进程统计收到信号的次数,并在收到第5次时输出“Received 5 signals, child exit!”,然后退出。父进程检测到子进程退出后(可通过SIGCHLD或wait),输出“Child terminated.”并自身退出。
  3. 提交代码和运行结果截图或文本

二、实验过程

1、程序实现

test.c

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <sys/wait.h>int signal_count = 0;  // 记录接收到的SIGUSR2信号的次数// 子进程接收到SIGUSR2信号的处理函数
void sigusr2_handler(int sig) {signal_count++;  // 每接收到一个SIGUSR2信号,计数器加一printf("Received signal %d times\n", signal_count);// 如果接收到第5次信号,子进程退出if (signal_count == 5) {printf("Received 5 signals, child exit!\n");exit(0);  // 子进程退出}
}int main() {pid_t pid = fork();  // 创建子进程if (pid < 0) {perror("fork failed");exit(1);}if (pid == 0) {  // 子进程// 设置SIGUSR2信号的处理函数signal(SIGUSR2, sigusr2_handler);// 子进程无限循环,等待信号while (1) {pause();  // 等待信号}} else {  // 父进程sleep(1);  // 给子进程一些时间来设置信号处理// 每2秒向子进程发送SIGUSR2信号for (int i = 0; i < 5; i++) {sleep(2);  // 每2秒发送一次kill(pid, SIGUSR2);  // 发送SIGUSR2信号给子进程}// 等待子进程退出(通过wait或SIGCHLD信号)int status;waitpid(pid, &status, 0);  // 等待子进程结束// 子进程退出后,父进程输出信息并退出printf("Child terminated.\n");exit(0);}return 0;
}

2、程序解析

  1. 信号处理

    • 子进程使用 signal(SIGUSR2, sigusr2_handler) 来设置 SIGUSR2 信号的处理函数。当子进程接收到 SIGUSR2 信号时,sigusr2_handler 函数会被调用,记录信号接收的次数,并在接收到第 5 次信号时退出子进程。
    • 父进程每隔 2 秒通过 kill(pid, SIGUSR2) 向子进程发送一个 SIGUSR2 信号。
  2. 父子进程通信

    • 父进程通过 fork() 创建一个子进程。如果 fork() 返回 0,则是子进程;如果返回一个正数,则是父进程,并且返回值是子进程的 PID。
    • 父进程使用 kill() 向子进程发送信号,子进程则使用 pause() 来等待并处理接收到的信号。
  3. 子进程退出

    • 子进程在接收到第 5 次 SIGUSR2 信号时,会输出 “Received 5 signals, child exit!” 并调用 exit(0) 退出。
  4. 父进程等待

    • 父进程通过 waitpid(pid, &status, 0) 等待子进程结束。子进程结束后,父进程会输出 “Child terminated.” 并退出。

3、编译和运行

在这里插入图片描述

  • 每隔 2 秒,父进程会发送一次 SIGUSR2 信号给子进程。
  • 子进程收到 5 次信号后输出“Received 5 signals, child exit!”并退出。
  • 父进程等待子进程退出后输出“Child terminated.”并结束。

5、Gitee仓库

仓库链接:https://gitee.com/li-zhen1215/homework/tree/master/Week8/keshang3

在这里插入图片描述

相关文章:

  • uniapp自定义封装tabbar
  • TDengine 数据缓存技术
  • iOS/Flutter混合开发之PlatformView配置与使用
  • 记录一次无界微前端的简单使用
  • Ubuntu 上手动安装 Go 环境并解决“可执行文件格式错误”
  • Mac「brew」快速安装Redis
  • 输入电抗器和输出电抗器的作用-杭州干扰净电子科技
  • 二叉树的遍历(广度优先搜索)
  • Springboot 手搓 后端 滑块验证码生成
  • 【GCC bug】libstdc++.so.6: version `GLIBCXX_3.4.29‘ not found
  • ES历史版本下载
  • uniapp-商城-36-shop 购物车 选好了 进行订单确认2 支付方式颜色变化和颜色滤镜filter
  • 高级java每日一道面试题-2025年4月25日-基础篇[反射篇]-在运行时,如何判断某个类是否实现了特定的接口或扩展了某个父类?
  • 算力网络(CFN)在跨校联合科研中的应用:安全性挑战与联邦调度实践
  • 《Keras 3 :使用 TFServing 提供 TensorFlow 模型》
  • PWNOS:2.0(vulnhub靶机)
  • 前端技术Ajax实战
  • 06-stm32时钟体系
  • 企业部署Power BI 报表服务器,在第三方系统嵌套该报表服务器,并实现单点登录
  • 【linux】Chrony服务器
  • 中国固体火箭发动机领域杰出专家赵殿礼逝世,享年92岁
  • 马上评|什么才是地方文旅宣传的正确姿势
  • 国台办:相关优化离境退税政策适用于来大陆的台湾同胞
  • 西夏文残碑等文物来沪,见证一段神秘灿烂的历史
  • 美国“杜鲁门”号航母一战机坠海
  • 亮剑浦江丨上海网信部门处罚一批医疗服务类互联网企业,三大类问题值得关注