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.pswp.cn/pingmian/91820.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/91820.shtml

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

相关文章

C++入门自学Day6-- STL简介(初识)

往期内容回顾 C模版 C/C内存管理&#xff08;初识&#xff09; C/C内存管理&#xff08;续&#xff09; STL简介&#xff1a; STL 是 C 标准库的重要组成部分&#xff0c;是一个通用程序设计的模板库&#xff0c;用于数据结构和算法的复用。它极大地提升了代码效率、可靠性…

从零开始搞定类与对象(中)

运算符重载1.当运算符被用于类类型的对象时&#xff0c;C语言允许我们通过运算符重载的形式指定新的含义。C规定类类型对象使用运算符时&#xff0c;必须转换成调用对应运算符重载&#xff0c;若没有对应的运算符重载&#xff0c;则会编译报错。2. 运算符重载是具有特殊名字的函…

SpringMVC实战指南:从环境搭建到功能实现全解析

第一章&#xff1a;SpringMVC环境搭建与基础配置1.1 Maven依赖配置在Maven项目中&#xff0c;SpringMVC的依赖配置是开发的第一步。根据Spring官方推荐&#xff0c;以下是SpringMVC 5.3.x版本的Maven依赖配置&#xff1a;<dependencies><!-- Spring MVC核心依赖 -->…

Repo 与 manifest

Manifest&#xff1a;它本身就是一个 git 仓库&#xff0c;其中存放的都是包含仓库和子仓库信息的XML文件。这些文件全部由开发者或者维护者手动配置并自己上传到 git 仓库。另外&#xff1a;Manifest 中的仓库之间的依赖关系 repo 也并不关心。所以它们可以是同级的也可以是包…

深入浅出 RabbitMQ:简单队列实战指南

大家好&#xff0c;我是工藤学编程 &#x1f989;一个正在努力学习的小博主&#xff0c;期待你的关注实战代码系列最新文章&#x1f609;C实现图书管理系统&#xff08;Qt C GUI界面版&#xff09;SpringBoot实战系列&#x1f437;【SpringBoot实战系列】SpringBoot3.X 整合 Mi…

Ubuntu22-Qt Creator-fcitx-中文输入

fcitx在ubuntu系统中路径 /usr/lib/x86_64-linux-gnu/qt5/plugins/platforminputcontexts/ /usr/lib/x86_64-linux-gnu/qt6/plugins/platforminputcontexts/ fcitx-qt5-1.2.7 编译 下载链接:https://github.com/fcitx/fcitx-qt5/archive/refs/tags/1.2.7.zip Qt版本:Qt C…

【Java基础|第十三篇】面向对象基础(三)——继承(一)继承的理解,实现,特点……

&#xff08;四&#xff09;面向对象&#xff1a; 5、继承&#xff1a; &#xff08;1&#xff09;理解&#xff1a; 概念&#xff1a; 继承是面向对象的三大特征之一 继承是类与类之间关系的一种&#xff08;是父类与子类的关系&#xff09; 使用场景&#xff1a; 一个类与另…

QGIS绿色版吉林一号切片体验版插件(Jilin1Tiles)更新

吉林一号更新2024年图源了但吉林一号切片体验版插件&#xff08;Jilin1Tiles&#xff09;还没有更新&#xff0c;我修改了一下代码&#xff0c;直接集成到QGIS绿色版中。如下&#xff1a;注意&#xff1a;第一次使用的时候需要选中启用一下插件&#xff1a;需要使用的可以直接下…

git操作命令和golang编译脚本

git子模块信息处理命令git init submodule git submodule updategit取消合并 git merge --abort git reset --hard HEAD{1}bat文件生成二进制set GOOSlinux set GOARCHamd64 go env -w GOFLAGS-modvendor go build -ldflags "-w -s" -ohallapiset GOOSlinux set GOAR…

通往L4之路:构建自我进化的智能驾驶决策大脑

摘要&#xff1a; 本文旨在提出一个超越当前主流“感知-预测-规划”分离式架构的下一代自动驾驶决策系统方案。面对自动驾驶领域最核心的“长尾场景”难题&#xff0c;本文借鉴并升华了一套源于复杂策略制定的决策智能框架&#xff0c;通过构建动态驾驶世界模型&#xff08;Dyn…

AI编程助手:终结996的新希望

引言程序员工作现状与“996”现象的普遍性AI技术快速发展对编程效率的潜在影响核心问题&#xff1a;AI IDE与AI辅助编程能否改变传统开发模式AI IDE与AI辅助编程的核心技术AI IDE的定义与功能&#xff08;代码补全、错误检测、自动重构等&#xff09;AI辅助编程工具&#xff08…

Anthropic 禁止 OpenAI 访问 Claude API:商业竞争与行业规范的冲突

Anthropic 禁止 OpenAI 访问 Claude API&#xff1a;商业竞争与行业规范的冲突 文章来源&#xff1a;Poixe AI 本周&#xff0c;美国 AI 公司 Anthropic 宣布禁止 OpenAI 通过 API 访问其 Claude 系列大模型。这一举动引发了行业对"友好基准测试"与商业竞争边界的热…

区块链 + 物联网落地案例:供应链溯源系统开发全记录

本文详细记录了区块链与物联网技术融合的供应链溯源系统开发全流程。从项目背景出发&#xff0c;阐述传统供应链溯源痛点&#xff0c;介绍系统开发的技术架构设计&#xff0c;包括物联网数据采集层、区块链数据存储层等核心模块&#xff0c;详解硬件选型、智能合约编写、数据上…

Windows环境下Intel Fortran如何安装配置NetCDF

NetCDF(Network Common Data Form)格式,简称nc格式,是一种自描述、与平台无关的二进制数据文件,特别适合多维数据的存储和交换,广泛应用于气象、海洋、地球科学等领域。本文介绍Windows环境下IntelFortran安装配置NetCDF的过程。 一、系统环境及准备工作 1. 系统 Wind…

tcp/udp的socket特点

tcp &#xff1a; 绑定一个 socket 只是用来监听&#xff0c;accept 对每个客户端生成一个 socket 用来维护滑动窗口等。每个客户端用一个 socket 用来维护滑动窗口等。 4 次挥手对应两次 close 的 fin 和返回的 ack。 而三次挥手在 connect 里阻塞完成。 ​udp &#xff1a; 双…

Linux命令top

top一、 命令二、 如何查看top输出的结果一、 命令 top命令是Linux中的一个实时进程监控工具&#xff0c;类似于windows中的任务管理器。 基本命令 top二、 如何查看top输出的结果 我们需要分析top输出的结果 top输出的结果分为上下两部分&#xff0c;先看上半部分 第一行是…

Perl 数据库连接

Perl 数据库连接 概述 Perl是一种强大的编程语言&#xff0c;广泛应用于文本处理、系统管理、网络编程等领域。随着数据库技术的快速发展&#xff0c;Perl与数据库的结合也日益紧密。本文将详细介绍Perl数据库连接的相关知识&#xff0c;包括常用的数据库类型、连接方法以及一些…

jenkins从入门到精通-P1—九五小庞

1. jenkins的两个核心为CI持续集成 CD持续部署2.jenkins在企业工作中的流程3. 学习的内容包括

第九节 Redis 事务、Redis 脚本

Redis 事务可以一次执行多个命令&#xff0c; 并且带有以下两个重要的保证&#xff1a; 事务是一个单独的隔离操作&#xff1a;事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中&#xff0c;不会被其他客户端发送来的命令请求所打断。事务是一个原子操作&#x…

托福阅读37-2

托福阅读37-2 1.reinforcement from reintroduction定位到倒数第二句&#xff0c;这里我没看懂former和term&#xff0c;直接懵掉了&#xff0c;然后往后看。这句话其实省略了&#xff0c;补充完应该是The former is termed reintroduction and the latter is termed reinforce…