c語言之進程函數

1. 進程創建

       #include <sys/types.h>#include <unistd.h>pid_t fork(void);

????????fork? ?創建一個新進程

????????fork() ?creates ?a ?new process by duplicating the calling process. ?The new process is referred to as the child process. ?The ?calling ?process ?is ?referred to as the parent process.

? ?fork()?通過復制調用進程來創建一個新進程。新創建的進程稱為子進程,而調用進程稱為父進程。

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>int main() {pid_t pid = fork();if (pid == 0) {/*在父進程中,子進程的pid==0getpid() 獲取進程id*/printf("子進程 PID: %d\n", getpid());} else {// 父進程pid 大于0printf("父進程 PID: %d\n", getpid());}return 0;
}

????????????????The ?child process and the parent process run in separate memory spaces. ?At
the time of fork() both memory spaces have the same content. ?Memory writes,
file ?mappings (mmap(2)), and unmappings (munmap(2)) performed by one of the
processes do not affect the other.
子進程和父進程運行在獨立的內存空間中。調用fork()時,兩者的內存空間內容完全一致。任一進程對內存的寫入、文件映射(mmap(2))或解除映射(munmap(2))操作均不會影響另一進程。

#include <unistd.h>
#include <stdio.h>int main() {int val = 10;pid_t pid = fork();if (pid == 0) {val = 20;  // 子進程修改不影響父進程printf("Child val: %d\n", val);} else {printf("Parent val: %d\n", val);  // 輸出仍為10}return 0;
}

2. 僵尸進程

????????僵尸進程(Zombie Process)是指已經完成執行(通過exit()系統調用終止)但其退出狀態尚未被父進程讀取(通過wait()waitpid()系統調用)的進程。

? ? ? ? 產生原因:父進程還存在,但是去做的別的事情了(比如在一個死循環,沒有退出),此時子進程退出之后,就變成了僵尸進程。

(可以用ps -ef 查看,進程的狀態欄為defunct,這就是所謂的“僵尸”進程)

3. 孤兒進程

? ? ? ? 孤兒進程指父進程終止或退出后仍在運行的子進程。這類進程會被系統內核的init進程(PID 為 1)接管,最終由init負責回收資源。

? ? ? ? 產生原因:父進程比子進程先結束。

4.? wait? waitpid

????????wait, waitpid?- 回收進程

       #include <sys/types.h>#include <sys/wait.h>pid_t wait(int *wstatus);pid_t waitpid(pid_t pid, int *wstatus, int options);

? ? ? ? ?int *wstatus? 狀態

????????退出狀態

? ? ????父進程監聽子進程退出狀態,如果正常退出,則輸出OK

? ? ????如果子進程異常,退出則輸出error

? ? ?????exit(-2)返回給父進程子進程退出狀態

? ? ?????wait(&state);

? ? ? ? ?waitpid(-1,&state,WNOHANG );

? ? ?????status == 0 正常退出

? ? ?????status != 0 異常退出

int options

? ? ? ? WNOHANG ? ? return immediately if no child has exited.

? ? ? ?WUNTRACED ? also ?return ?if ?a ?child ?has ?stopped ?(but ?not ?traced ?via
ptrace(2)). ?Status for traced children which ?have ?stopped ?is
provided even if this option is not specified.

? ? ? ?WCONTINUED (since Linux 2.6.10)
also ?return ?if a stopped child has been resumed by delivery of
SIGCONT.

WNOHANG

立即返回,若沒有子進程退出。

???????????????當返回值ret>0的時候表示子進程退出

? ? ? ? ? ? ???當返回值ret=0的時候表示等待子進程的退出

WUNTRACED

若子進程停止(但未被ptrace(2)跟蹤),也返回狀態。對于被跟蹤且停止的子進程,即使未指定此選項,仍會提供其狀態信息。

WCONTINUED(自Linux 2.6.10起)

若停止的子進程因收到SIGCONT信號而恢復執行,也返回狀態。

wait 阻塞等待回收進程

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>int main(int argc, char const *argv[])
{printf("hello wprld\n");pid_t id = fork();if (id == -1){printf("fork fail\n");}else if (id > 0){printf("[%d]我是父進程\n", getpid());wait(NULL);    //等待子進程執行完畢后再往下執行,阻塞等待回收,循環掃描子進程printf("子進程已回收 結束\n");}else{int count = 10;while (count--){printf("[%d]我子進程%d\n", getpid(), count);sleep(1);}}return 0;
}

waitpid? 非阻塞等待回收

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>int main(int argc, char const *argv[])
{printf("hello wprld\n");pid_t id = fork();if (id == -1){printf("fork fail\n");}else if (id > 0){while(1){int ret = waitpid(-1, NULL, WNOHANG);printf("ret=%d\n", ret);if (ret < 0)break;sleep(1);}//等價//while(waitpid(-1,NULL,WNOHANG)==0);   }else{int count = 10;while (count--){printf("[%d]我子進程%d\n", getpid(), count);sleep(1);}}return 0;
}

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

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

相關文章

學習python第12天

今日任務&#xff1a;DataFrameDataFrame的構造pandas.DataFrame(dataNone, indexNone, columnsNone, dtypeNone, copyFalse)參數說明&#xff1a;data&#xff1a;DataFrame 的數據部分&#xff0c;可以是字典、二維數組、Series、DataFrame 或其他可轉換為 DataFrame 的對象。…

C++顯示類型轉換運算符static_cast使用指南

這是一篇關于 static_cast 用法的文章。本文會從基礎概念到常見應用場景全覆蓋&#xff0c;并附上代碼示例以方便理解。C 中的 static_cast 用法詳解 在 C 中&#xff0c;static_cast 是一種顯式類型轉換運算符&#xff0c;主要用于在編譯期進行類型安全的轉換。相比 C 風格的強…

es6常用方法來解決功能需求

前言&#xff1a;es6常用方法來解決功能需求。1、出現復雜的json字符串如何去解析&#xff1f;比如&#xff1a;下面這個字符串&#xff0c;如果用json.parse解析發現還是個字符串"\"[{\\\"orgId\\\":\\\"1054021138280960\\\",\\\"orgName…

龍虎榜——20250822

上證指數今天繼續創新高收中陽線&#xff0c;量能維持在5天均量線附近&#xff0c;目前均線多頭強勢的走勢&#xff0c;小級別也未出現反轉信號&#xff0c;上漲趨勢不要輕易看空。深證指數今天延續強勢的走勢&#xff0c;大漲收光頭光腳的陽線&#xff0c;目前均線多頭排列&am…

3維模型導入到3Dmax中的修改色彩簡單用法----第二講

目錄回顧1 補充信息*stp導出沒有顏色怎么辦&#xff1f;*2 3Dmax的使用如果顏色丟失了怎么辦呢&#xff1f;怎么實現一零件上多個色彩呢&#xff1f;怎么將零件綁到一起呢&#xff1f;怎么將三角形的面變成光滑曲面呢&#xff1f;回顧 上一講&#xff0c;我們簡單的說了一下&a…

智慧農業新基建:邊緣計算網關在精準農業中的落地實踐案例

智慧農業新基建&#xff1a;邊緣計算網關在精準農業中的落地實踐案例傳統農業生產中&#xff0c;水肥管理依賴經驗判斷&#xff0c;往往造成資源浪費和產量不穩定&#xff1b;同時&#xff0c;惡劣的自然環境也給農業生產帶來諸多挑戰。而藍蜂邊緣計算網關在精準農業中的應用&a…

llm操控solidworks 畫立方體 deepseek

deepseek接入solidowrks畫立方體用eval方法鏈接llm和solidworks pythonwin32接口 離好的效果還差一個有腦子會生成復雜命令序列的ai 參考 基于Python的Solidworks二次開發方法_selectbyray-CSDN博客 Welcome - 2025 - SOLIDWORKS API Help 倉庫 llm_sw: llm鏈接solidworks…

MySQL事務及原理詳解

MySQL 事務 事務是一組不可分割的操作集合&#xff0c;這些操作要么同時成功提交&#xff0c;要么同時失敗回滾。 acid事物的四大特性 原子性 最小工作單元&#xff0c;要么同時成功&#xff0c;要么同時失敗。 例如A轉賬300給B,A賬戶-300與B賬戶300必須滿足操作原子性&#xf…

Flutter上手記:為什么我的按鈕能同時在iOS和Android上跳舞?[特殊字符][特殊字符]

文章目錄&#x1f525; 先解決靈魂拷問&#xff1a;憑啥選Flutter&#xff1f;&#x1f9f1; 解剖Flutter&#xff1a;它肚子里藏著什么黑科技&#xff1f;三層蛋糕架構 &#x1f382;狀態管理&#xff1f;江湖門派大戰&#xff01; &#x1f94b;&#x1f6e0; 真實項目暴擊&a…

單片 、物聯網、51單片機、軟硬件之基于STM32與藍牙的倉儲管控系統的設計與實現/基于物聯網的倉庫管理系統

單片 、物聯網、51單片機、軟硬件之基于STM32與藍牙的倉儲管控系統的設計與實現/基于物聯網的倉庫管理系統

Product Hunt 每日熱榜 | 2025-08-22

1. Mocke 標語&#xff1a;模擬郵件營銷&#xff1a;在不發起活動的情況下了解你的回復率 介紹&#xff1a;Mocke AI代理模擬運行電子郵件營銷活動&#xff0c;并在一分鐘內返回結果&#xff0c;包括郵件的打開率、回復率和退訂率。它還會揭示每個潛在客戶為何未打開郵件、報…

基于Java+SpringBoot+Vue+HTML5電影評論網站系統(源碼+LW+調試文檔+講解等)/電影評論/網站系統/電影/評論/網站/系統/影評網站/電影網站/評論系統/電影評論系統

博主介紹 &#x1f497;博主介紹&#xff1a;?全棧領域優質創作者&#xff0c;專注于Java、小程序、Python技術領域和計算機畢業項目實戰?&#x1f497; &#x1f447;&#x1f3fb; 精彩專欄 推薦訂閱&#x1f447;&#x1f3fb; 2025-2026年最新1000個熱門Java畢業設計選題…

家用電器,讓現代家庭生活更美好

在現代家庭中&#xff0c;家用電器早已不再是冰冷的機器&#xff0c;而是成為了我們生活中不可或缺的一部分。它們以科技之名&#xff0c;融入我們的日常&#xff0c;讓生活變得更加便捷、舒適和美好。 清晨&#xff0c;當第一縷陽光透過窗簾&#xff0c;智能咖啡機已經為您準備…

RabbitMQ延時隊列的兩種實現方式

目錄 一、延時插件實現 1、版本要求 2、為運行新容器時安裝 3、為已運行的容器安裝 4、驗證安裝 5、代碼編寫 1. 配置類 2. 生產者 3. 消費者 二、死信隊列實現 1、代碼編寫 1. 配置類 2. 生產者 3. 消費者 三、踩坑記錄 1、發送消息失敗 2、消息過期后未能轉…

深度學習在股票量化中的應用

深度學習在股票量化中的具體應用&#xff1a;從時間序列預測到Alpha挖掘深度學習并非量化交易的銀彈&#xff0c;但它是一套強大的工具集&#xff0c;能夠解決傳統量化方法難以處理的復雜問題。其核心價值在于從海量、高維、非結構化的數據中自動提取有效特征并發現非線性關系。…

Web 安全之 HTTP 響應截斷攻擊詳解

這不是危言聳聽。 在一次安全審計中&#xff0c;某電商平臺發現&#xff1a; 用戶訪問首頁后&#xff0c;自動跳轉到了賭博網站。 但代碼沒被篡改&#xff0c;服務器沒被入侵&#xff0c;日志一切正常。 最終追查發現—— 罪魁禍首&#xff0c;竟是一個 %0d%0a&#xff08;回車…

Envoy配置ext_proc

介紹 本文將使用gateway api inference extension作為envoy的ext_proc服務端 啟動Ext_Proc 基于Gateway API Inference Extension https://github.com/kubernetes-sigs/gateway-api-inference-extension.git 先clone代碼到本地 git clone https://github.com/kubernetes-…

echarts關系圖(Vue3)

基礎版效果圖&#xff1a;后期請求接口&#xff0c;接入數據即可用<template><div><v-chartref"vChartRef":option"option"style"width: 100%; height: 800px"></v-chart></div> </template><script lan…

【LeetCode】17. 電話號碼的字母組合

文章目錄17. 電話號碼的字母組合題目描述示例 1&#xff1a;示例 2&#xff1a;示例 3&#xff1a;提示&#xff1a;解題思路算法分析問題本質分析回溯法詳解組合生成過程可視化數字映射關系各種解法對比算法流程圖邊界情況處理時間復雜度分析空間復雜度分析關鍵優化點實際應用…

全文 part1 - DGEMM Using Tensor Cores, and Its Accurate and Reproducible Versions

摘要 本文提出了一種在 NVIDIA 圖形處理器&#xff08;GPU&#xff09;的張量核心&#xff08;Tensor Cores&#xff0c;僅含 FP16、INT8 等 GEMM 計算功能&#xff09;上實現 FP64&#xff08;雙精度&#xff0c;DGEMM&#xff09;和 FP32&#xff08;單精度&#xff0c;SGEMM…