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

Shell 脚本发送信号给 C 应用程序,让 C 应用程序回收线程资源后自行退出。

下面分别给出一个 Shell 脚本和 C 程序的例子,实现通过 Shell 脚本发送信号给 C 应用程序,让 C 应用程序回收线程资源后自行退出。

原理

在 Linux 系统中,我们可以使用信号机制来实现进程间的通信。Shell 脚本可以使用 kill 命令向指定的进程发送信号,而 C 程序可以使用 signal 或 sigaction 函数来捕获这些信号,并在信号处理函数中进行线程资源的回收和程序的退出操作。

C 程序示例

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <pthread.h>
#include <unistd.h>// 全局变量,用于标记是否收到终止信号
volatile sig_atomic_t terminate = 0;// 线程函数
void *thread_function(void *arg) {while (!terminate) {printf("线程正在运行...\n");sleep(1);}printf("线程收到终止信号,开始清理资源...\n");// 这里可以添加更多的资源清理代码pthread_exit(NULL);
}// 信号处理函数
void signal_handler(int signum) {if (signum == SIGTERM) {printf("收到 SIGTERM 信号,开始终止程序...\n");terminate = 1;}
}int main() {pthread_t thread;// 注册信号处理函数signal(SIGTERM, signal_handler);// 创建线程if (pthread_create(&thread, NULL, thread_function, NULL) != 0) {perror("线程创建失败");return 1;}// 等待线程结束pthread_join(thread, NULL);printf("所有线程资源已回收,程序退出...\n");return 0;
}

代码解释

  1. 全局变量 terminate:用于标记是否收到终止信号,volatile sig_atomic_t 确保在多线程环境下该变量的访问是原子的。
  2. 线程函数 thread_function:在一个循环中持续运行,直到 terminate 变为 1,表示收到终止信号,然后进行资源清理并退出线程。
  3. 信号处理函数 signal_handler:当收到 SIGTERM 信号时,将 terminate 标记为 1,通知线程停止运行。
  4. 主函数 main:注册信号处理函数,创建线程,并等待线程结束。

Shell 脚本示例

#!/bin/bash# 编译 C 程序
gcc -o my_program my_program.c -lpthread# 启动 C 程序
./my_program &
pid=$!  # 获取 C 程序的 PID# 等待一段时间
sleep 5# 发送 SIGTERM 信号给 C 程序
kill -SIGTERM $pid# 等待 C 程序退出
wait $pidecho "C 程序已退出"

代码解释

  1. 编译 C 程序:使用 gcc 编译 C 程序,并生成可执行文件 my_program
  2. 启动 C 程序:使用 & 符号将 C 程序放到后台运行,并使用 $! 获取其 PID。
  3. 等待一段时间:使用 sleep 命令等待 5 秒,让 C 程序有足够的时间运行。
  4. 发送信号:使用 kill -SIGTERM 命令向 C 程序发送 SIGTERM 信号。
  5. 等待程序退出:使用 wait 命令等待 C 程序退出,并打印退出信息。

运行步骤

  1. 将上述 C 代码保存为 my_program.c,将 Shell 脚本保存为 send_signal.sh
  2. 给 Shell 脚本添加执行权限:chmod +x send_signal.sh
  3. 运行 Shell 脚本:./send_signal.sh

通过以上步骤,你可以看到 Shell 脚本成功发送信号给 C 程序,C 程序在收到信号后回收线程资源并退出。

http://www.dtcms.com/a/314362.html

相关文章:

  • Linux服务器管理MySQL数据库的常见命
  • Spring AI 系列之三十三 - Spring AI Alibaba-Graph框架之人类反馈
  • 区块链基础之Merkle B+树
  • 【Spring】SpringBoot自动注入原理分析,@SpringBootApplication、@EnableAutoConfiguration详解
  • Java类与对象练习题
  • 运动想象 (MI) 分类学习系列 (18) : MSVTNet
  • 一(1)关于单链表中的疑问
  • Spring AI实战:SpringBoot项目结合Spring AI开发——提示词(Prompt)技术与工程实战详解
  • SAP-ABAP:ABAP Open SQL 深度解析:核心特性、性能优化与实践指南
  • 设计模式 -> 策略模式(Strategy Pattern)
  • 2025年8月4日私鱼创作平台v1.0.4公测版更新发布-完成大部分功能包含关注创作者以及发布作品及合集功能优雅草科技
  • 06 基于sklearn的机械学习-欠拟合、过拟合、正则化、逻辑回归
  • 线程互斥锁:守护临界区的关键
  • 可编辑190页PPT | 某科技集团数字化转型SAP解决方案
  • Vue 3 版本的 JWT 单点登录 (SSO) 实现
  • 国家科学技术奖答辩PPT案例_科技进步奖ppt制作_技术发明奖ppt设计美化_自然科学奖ppt模板 | WordinPPT
  • 使用mybatis生成器生成实体类mapper和查询参数文件,实现简单增删改查。使用log4j输出日志到控制台。使用配置文件注册Bean,配置视图解析器
  • 【Java】使用模板方法模式设计EasyExcel批量导入导出
  • Apache Camel 中 ProducerTemplate
  • 刷题日志(7)——二叉树高频习题(下)
  • 高精度实战:YOLOv11交叉口目标行为全透视——轨迹追踪×热力图×滞留分析(附完整代码)
  • FrePrompter: Frequency self-prompt for all-in-one image restoration
  • Opencv[一]
  • R 语言科研绘图第 67 期 --- 箱线图-显著性
  • Spark SQL:用SQL玩转大数据
  • OpenCV轻松入门_面向python(第二章图像处理基础)
  • 论文阅读笔记:《Dataset Distillation by Matching Training Trajectories》
  • 【数据结构初阶】--算法复杂度详解
  • 登录弹窗,cv直接使用
  • 【FreeRTOS】系统时钟配置