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

一、实验要求

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

二、实验过程

1、程序实现

test.c

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

相关推荐
棱镜研途7 小时前
学习笔记丨卷积神经网络(CNN):原理剖析与多领域Github应用
图像处理·笔记·学习·计算机视觉·cnn·卷积神经网络·信号处理
mozun202016 小时前
激光雷达学习-信噪比SNR与信背比SBR2025.7.11
学习·目标检测·信号处理·信噪比·弱小目标检测·信背比
刘孬孬沉迷学习17 小时前
5G标准学习笔记15 --CSI-RS测量
网络·笔记·学习·5g·信息与通信·信号处理
狄加山6751 天前
Cadence模块复用
服务器·硬件架构·硬件工程·信号处理·智能硬件
jz_ddk1 天前
[实战]调频(FM)和调幅(AM)信号生成(完整C语言实现)
c语言·算法·信号处理
XINVRY-FPGA1 天前
XCZU47DR-2FFVG1517I Xilinx FPGA AMD ZynqUltraScale+ RFSoC
人工智能·嵌入式硬件·fpga开发·信息与通信·信号处理·射频工程·fpga
LuDvei2 天前
CH9121T电路及配置详解
服务器·嵌入式硬件·物联网·网络协议·tcp/ip·网络安全·信号处理
孤独的追光者3 天前
论文阅读|汽车虚拟环绕音响系统设计与实现策略的比较研究
算法·汽车·音频·信号处理·数字信号处理
weixin_452600693 天前
GC393低功耗双电压比较器:精准、高效的信号处理解决方案
单片机·嵌入式硬件·智能家居·信号处理·音响·蓝牙音箱
学术小八3 天前
第二届虚拟现实、图像和信号处理国际学术会议(VRISP 2025)
信号处理·图像·虚拟现实