kill子進程后再wait可以嗎?

在父進程中先使用 kill 函數終止子進程,之后再使用 wait 函數是可行的,下面從原理、使用示例、注意事項幾個方面詳細說明。

原理

  • kill 函數:其作用是向指定進程發送信號。當向子進程發送 SIGTERM(通常用于請求進程正常終止)或者 SIGKILL(強制終止進程)這類終止信號時,子進程會收到信號并做出相應反應,一般會終止運行。子進程終止后,會進入僵尸狀態,此時它雖然已經停止執行,但仍保留一些進程信息,等待父進程調用 wait 系列函數來回收這些資源。
  • wait 函數:父進程調用 wait 函數時,若有子進程處于僵尸狀態,wait 函數會獲取該子進程的終止狀態信息,然后釋放子進程占用的系統資源,將其從系統進程表中移除。

使用示例

以下代碼展示了先使用 kill 函數終止子進程,再使用 wait 函數回收子進程資源的過程:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <signal.h>int main() {pid_t pid;int status;// 創建子進程pid = fork();if (pid < 0) {perror("fork");exit(EXIT_FAILURE);} else if (pid == 0) {// 子進程代碼printf("子進程開始執行,進程ID: %d\n", getpid());while (1) {// 子進程進入無限循環,模擬長時間運行的任務sleep(1);}} else {// 父進程代碼sleep(2);  // 等待一段時間,確保子進程開始執行printf("父進程發送 SIGTERM 信號終止子進程 %d\n", pid);// 向子進程發送 SIGTERM 信號if (kill(pid, SIGTERM) == -1) {perror("kill");exit(EXIT_FAILURE);}// 父進程等待子進程結束pid_t terminated_pid = wait(&status);if (terminated_pid == -1) {perror("wait");exit(EXIT_FAILURE);}if (WIFSIGNALED(status)) {printf("子進程 %d 因信號 %d 終止\n", terminated_pid, WTERMSIG(status));}}return 0;
}

代碼解釋

  1. 子進程:創建后進入一個無限循環,模擬長時間運行的任務。
  2. 父進程:等待 2 秒后,使用 kill 函數向子進程發送 SIGTERM 信號,請求子進程終止。然后調用 wait 函數等待子進程結束,并獲取其終止狀態信息。

注意事項

  • 信號處理:子進程可以捕獲并處理 SIGTERM 信號,這意味著子進程可能不會立即終止。若需要強制終止子進程,可以使用 SIGKILL 信號,但要注意 SIGKILL 信號不能被捕獲或忽略。
  • 錯誤處理:在調用 killwait 函數時,要檢查其返回值,對可能出現的錯誤進行處理。例如,kill 函數可能因為權限不足或者目標進程不存在而調用失敗。
  • 僵尸進程:若不調用 wait 函數回收子進程的資源,子進程會變成僵尸進程,占用系統資源。所以在終止子進程后,務必使用 wait 系列函數來回收資源。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/73855.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/73855.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/73855.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ai-api-union項目,適配各AI廠商api

項目地址&#xff1a;alpbeta/ai-api-union 需求&#xff1a;實現兼容各大模型廠商api的流式對話和同步對話接口&#xff0c;本項目現兼容智譜、豆包、通義、通義版deepseek 設計 一個ChatController類對外暴露這兩個接口&#xff0c;入參都為ChatRequest請求類&#xff0c;…

【QT】QT樣式設計

QT樣式設計 一、QT工程中添加資源文件1.資源文件&#xff1a;2. 添加步驟&#xff1a;3. 新增資源文件以及刪除現有的資源文件4. 使用資源文件 二、QT中的qss語句(樣式設計語句)1. 樣式設計2.常見的qss語句示例代碼&#xff1a; 一、QT工程中添加資源文件 1.資源文件&#xff…

Megatron-LM中的deepseek-v3實現

Megatron-LM&#xff1a;https://github.com/NVIDIA/Megatron-LM/tree/main 使用此倉庫構建的著名的庫也有很多&#xff0c;如: Colossal-AI, HuggingFace Accelerate, and NVIDIA NeMo Framework.Pai-Megatron-Patch工具是阿里人工智能平臺PAI算法團隊研發,ai-Megatron-Patch…

[mlr3] Bootstrap與交叉驗證k-fold cross validation

五折交叉驗證因其無放回分層抽樣和重復驗證機制&#xff0c;成為超參數調優的首選&#xff1b; 而Bootstrap因有放回抽樣的重復性和驗證集的不穩定性&#xff0c;主要服務于參數估計&#xff08;置信區間的計算&#xff09;而非調優。 實際應用中&#xff0c;可結合兩者優勢&am…

某大麥手機端-搶票

引言 僅供學習研究&#xff0c;歡迎交流 搶票難&#xff0c;難于上青天&#xff01;無論是演唱會、話劇還是體育賽事&#xff0c;大麥網的票總是秒光。作為一名技術愛好者&#xff0c;你是否想過用技術手段提高搶票成功率&#xff1f;本文將為你揭秘大麥手機端搶票的核心技術…

最常使用的現代C++新特性介紹

現代 C泛指的是從 C11 之后的 C標準. 從 C11 開始, C標準委員會實行班車制, 沒三年發布一個新版本, 如果一個功能在新版本發布之前已經準備好, 則可以加入該版本中, 否則延后到下一個版本. 語言核心 自 C11 開始, 語言語法層面加了許多語法糖, 還有增加了一些新語法.使得 C語…

SQL Server:當在刪除數據庫時因為存在觸發器而無法刪除

當在刪除數據庫時因為存在觸發器而無法刪除&#xff0c;你可以通過禁用觸發器來解決這個問題。下面為你介紹在 SQL Server 里禁用和啟用觸發器的方法。 禁用數據庫中所有表的觸發器 你可以使用系統視圖 sys.triggers 來查詢數據庫里所有的觸發器&#xff0c;然后生成禁用這些…

【Linux篇】進程入門指南:操作系統中的第一步

步入進程世界&#xff1a;初學者必懂的操作系統概念 一. 馮諾依曼體系結構1.1 背景與歷史1.2 組成部分1.3 意義 二. 進程2.1 進程概念2.1.1 PCB&#xff08;進程控制塊&#xff09; 2.2 查看進程2.2.1 使用系統文件查看2.2.2 使?top和ps這些??級?具來獲取2.2.3 通過系統調用…

銷售易vs紛享銷客:制造行業CRM選型深度解析

“以客戶為中心”&#xff0c;顧名思義就是指讓客戶貫穿企業市場、研發、生產、銷售、服務全流程&#xff0c;以客戶需求為導向進行經營。CRM作為企業數字化建設基礎設施&#xff0c;在企業高質量發展進程中扮演著重要角色。在眾多CRM解決方案中&#xff0c;騰訊旗下CRM銷售易憑…

【JavaScript】九、JS基礎練習

文章目錄 1、練習&#xff1a;對象數組的遍歷2、練習&#xff1a;猜數字3、練習&#xff1a;生成隨機顏色 1、練習&#xff1a;對象數組的遍歷 需求&#xff1a;定義多個對象&#xff0c;存數組&#xff0c;遍歷數據渲染生成表格 let students [{ name: 小明, age: 18, gend…

代碼隨想錄day31 貪心part05

56.合并區間 以數組 intervals 表示若干個區間的集合&#xff0c;其中單個區間為 intervals[i] [starti, endi] 。請你合并所有重疊的區間&#xff0c;并返回 一個不重疊的區間數組&#xff0c;該數組需恰好覆蓋輸入中的所有區間 。 示例 1&#xff1a; 輸入&#xff1a;in…

《C++11:通過thread類編寫C++多線程程序》

關于多線程的概念與理解&#xff0c;可以先了解Linux下的底層線程。當對底層線程有了一定程度理解以后&#xff0c;再學習語言級別的多線程編程就輕而易舉了。 【Linux】多線程 -&#xff1e; 從線程概念到線程控制 【Linux】多線程 -&#xff1e; 線程互斥與死鎖 語言級別的…

c++位運算總結

在C中&#xff0c;位運算是對二進制位進行操作的運算&#xff0c;主要有以下幾種&#xff1a; 1. 按位與&#xff08; & &#xff09;&#xff1a;兩個操作數對應位都為1時&#xff0c;結果位才為1&#xff0c;否則為0。例如 3 & 5 &#xff0c; 3 二進制是 0000 0011…

1.1 計算機網絡的概念

首先來看什么是計算機網絡&#xff0c;關于計算機網絡的定義并沒有一個統一的標準&#xff0c;不同的教材有 不同的說法&#xff08;這是王道書對于計算機網絡的定義&#xff09;&#xff0c;我們可以結合自己的生活經驗去體會這個 定義。 可以用不同類型的設備去連接計算機網絡…

用LLama factory時報類似Process 2504721 got signal: 1的解決方法

之前用nohup來遠程跑LLama factory微調腳本&#xff0c;是沒有問題的&#xff0c;但今天發現運行類似下面這個命令時&#xff0c; nohup llamafactory-cli train examples/train_qlora/qwen_lora.yaml 只要一關閉ssh session&#xff0c;就會終止訓練&#xff0c;報類似&…

python常用內置時間函數+藍橋杯時間真題

1.time 1.1 time.time() 時間戳指&#xff1a;1970年1月1日開始到現在所經過的秒數 import time print(time.time()) # 輸出可得1970年1月1日開始到執行此代碼所經過的秒數 1.2 time.localtime() 返回一個當前時間的時間對象&#xff0c;具體信息&#xff0c;并且可以單獨…

一個用 C 語言打印出所有三位數水仙花數的程序

水仙花數&#xff08;Narcissistic number&#xff09;是指一個三位數&#xff0c;其各位數字的立方和等于該數本身。例如&#xff1a;153 是一個水仙花數&#xff0c;因為 (1^3 5^3 3^3 153)。 以下是一個用 C 語言打印出所有三位數水仙花數的程序&#xff1a; 代碼實現 …

利用 VSCode 配置提升 vibe coding 開發效率

利用 VSCode 配置提升 vibe coding 開發效率 Vibe Coding&#xff08;氛圍編程&#xff09;是一種基于AI的編程方法&#xff0c;其核心在于通過自然語言描述軟件需求&#xff0c;再由大規模語言模型&#xff08;LLM&#xff09;自動生成代碼&#xff0c;從而實現對傳統手寫編程…

練習題:110

目錄 Python題目 題目 題目分析 需求理解 關鍵知識點 實現思路分析 代碼實現 代碼解釋 函數定義&#xff1a; 計算值的總和&#xff1a; 測試函數&#xff1a; 運行思路 結束語 Python題目 題目 定義一個函數&#xff0c;接受一個字典作為參數&#xff0c;返回字…

處理 Linux 信號:進程控制與異常管理的核心

個人主頁&#xff1a;chian-ocean 文章專欄-Linux 前言&#xff1a; 在 Linux 操作系統中&#xff0c;信號是用于進程間通信的一種機制&#xff0c;能夠向進程發送通知&#xff0c;指示某些事件的發生。信號通常由操作系統內核、硬件中斷或其他進程發送。接收和處理信號是 Li…