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
英文地址,請注明出處:http://en.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…