Linux系統編程——進程(函數)

回調函數:

atexit()

原型:? ? ? ? int atexit(void (*function)(void));

功能:? ? ? ? 注冊進程退出前執行的函數

參數:? ? ? ? @function? ? ? ? 函數指針,指向void返回值void參數的函數指針

返回值? ? ? ? 成功 返回0

? ? ? ? ? ? ? ? ? ?失敗 返回非0

當注冊調用exit或者由main函數執行return時,所有用atexit注冊的退出函數,將會由注冊時順序被調用

代碼示例:

#include <dirent.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>FILE* fp;
char* p;
void clean()
{printf("clean fun ,p is %s\n", p);fclose(fp);free(p);
}int main(int argc, char** argv){atexit(clean);fp = fopen("1.txt", "r");p = malloc(50);strcpy(p, "hello");printf("process will end..\n");return 0;
}

進程空間的回收

wait() / waitpid()

原型:? ? ? ? pit_t wait(int *status);? ? ? ? //阻塞回收(等待子進程結束再回收)

功能:? ? ? ? 該函數可以阻塞等待任意子進程退出并回收該進程的狀態(一次回收一個子進程)

? ? ? ? ? ? ? ? ? ? ? ? //一般用于父進程回收子進程的狀態

參數:? ? ? ? @status? ? ? ? 進程退出時候的狀態

? ? ? ? ? ? ? ? ? ? ? ? //如果不關心其退出狀態一般用NULL表示

? ? ? ? ? ? ? ? ? ? ? ? //如果要回收進程退出狀態(正常退出 / 異常退出),則用WEXITSTATUS回收

返回值? ? ? ? 成功 返回回收的子進程的pid

? ? ? ? ? ? ? ? ? ?失敗 返回-1

1)如果所有的子進程都在運行,在阻塞
2)如果一個子進程終止,正在等待的父進程則獲得終止狀態,獲得子進程的狀態后,立刻返回。
3)如果沒有子進程,則立即出錯退出。

4)由父進程調用,回收子進程的pcb,會阻塞,父進程回收資源的時候,子進程沒有退出。父進程就會等待子進程結束再回收。


waitpid(-1, status, 0) = wait(status)

原型:????????pid_t waitpid(pid_t pid, int status);? ? ? ? //非阻塞回收

功能:????????用于等待特定子進程的狀態變化

參數:? ? ? ? @pid

? ? ? ? ? ? ? ? ? ?@status

int status;
waitpid(pid, &status, 0);

// 檢查宏:? ? ? ? //三組宏兩兩一組配合使用
WIFEXITED(status) ? ?// 子進程正常退出
WEXITSTATUS(status) ?// 獲取退出狀態碼


WIFSIGNALED(status) ?// 子進程被信號終止
WTERMSIG(status) ? ? // 獲取終止信號編號


WIFSTOPPED(status) ? // 子進程是否被暫停
WSTOPSIG(status) ? ? // 獲取暫停信號編號

返回值

? ? ? ??


代碼示例:

//<1>完整使用示例

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>int main(int argc, char **argv)
{pid_t pid = fork();if (pid > 0){printf("father pid:%d, child pid:%d\n", getpid(), pid);int status;while (1){//非阻塞回收pid_t recycle_pid = waitpid(pid, &status, WNOHANG);  if (pid == recycle_pid)                              {printf("recycle_pid:%d\n", recycle_pid);//子進程正常結束if (WIFEXITED(status)){printf("child ret value is %d\n", WEXITSTATUS(status));}else if (WIFSIGNALED(status)){printf("child unnormal,signal is %d\n", WTERMSIG(status));}break;}else if (0 == recycle_pid)  //子進程未結束{printf("子進程未結束...\n");usleep(1000*500);//0.5s}else{printf("waitpid error...\n");break;}}}else if (0 == pid){int i = 10;while (i--){printf("I'm processing....\n");sleep(1);}exit(20);}else{perror("fork error\n");return 1;}return 0;
}

//<2>非阻塞回收制定進程

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>int main(void)
{int id = 2;int n = 0;printf("n = :");scanf("%d", &n);pid_t pid[5] = {0};//創建5個子進程while (n--){pid[n] = fork();if (pid[n] > 0){continue;}else if (0 == pid[n]){printf("%d pid:%d\n",n, getpid());sleep(rand() % 5+1);exit(20);}else{perror("fork err...\n");return 1;}}//回收id = 2的進程while (1){pid_t recycle_pid = waitpid(pid[id-1], NULL, WNOHANG);if(pid[id-1] == recycle_pid)    //回收成功,相當于recycle_pid > 0{printf("recycle_pid: %d success\n",recycle_pid);break;}else if(0 == recycle_pid)   {}else    //recycle_pid<0,回收失敗{printf("recycle_pid failure....\n");}}return 0;
}

exec族

? ? ? ? 功能:用fork創建子進程后執行的是和父進程相同的程序 (但有可能執行不同的代碼分支)
子進程往往要調用一種exec函數以執行另一個程序。當進程調用一種exec函數時,該進程的
用戶空間代碼和數據完全被新程序替換,從新程序的啟動例程開始執行。調用exec并不創建
新進程,所以調用exec前后該進程的id并未改變。
其實有六種以exec開頭的函數,統稱exec函數:

頭文件:#include <unistd.h>

!!!調用非系統可執行程序,第一個參數都傳路徑+文件名


原型:????????int execl(const char *path, const char *arg, ...,/* (char ?*) NULL */);? // l :list

參數:????????@path? ? ? ? 可執行程序的路徑

? ? ? ? ? ? ? ? ? ?@arg? ? ? ? 參數 [字符串的形式] 列表,可以有多個?

? ? ? ? ? ? ? ? ? ?@NULL? ? ? ? 參數結束標志(不能省)

示例:execl("/bin/ls", "ls","-a","-l","--color == auto",NULL);


原型:????????int execlp(const char *file, const char *arg, ...,/* (char ?*) NULL */);? //p: PATH

參數:????????@file? ? ? ? 文件名(在系統路徑$PATH 下可以找到)? ? ? ? //命令:echo $PATH

? ? ? ? ? ? ? ? ? ?@arg? ? ? ? 參數 [字符串的形式] 列表,可以有多個?

? ? ? ? ? ? ? ? ? ?@NULL? ? ? ? 參數結束標志(不能省)

示例:

?PATH 系統環境變量 查看命令:echo $PATH
execlp("ls", "ls", "-a", "-l", "--color=auto", NULL);


原型:????????int execv(const char *path, char *const argv[],NULL);? ? ? ? // v:vector(數組)

參數:????????@path? ? ? ? 可執行程序的路徑

? ? ? ? ? ? ? ? ? ?@arg? ? ? ? 參數 [字符串的形式] 列表,可以有多個?

? ? ? ? ? ? ? ? ? ?@NULL? ? ? ? 參數結束標志(不能省)

示例:

char *const args[] = {"cp", "11exec.c", "cp.txt",NULL};
execv("/bin/cp", args);


原型:???????? int execvp(const char *file, char *const argv[],NULL);? // vp: vector path? ? ? ??

參數:????????@file? ? ? ? 文件名(在系統路徑$PATH 下可以找到)???????? //命令:echo $PATH

? ? ? ? ? ? ? ? ? ?@arg? ? ? ? 參數 [字符串的形式] 列表,可以有多個?

? ? ? ? ? ? ? ? ? ?@NULL? ? ? ? 參數結束標志(不能省)

示例:

char *const args[] = {"cat","11exec.c",NULL};
execvp(args[0], args);


??

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

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

相關文章

均勝電子上半年毛利率持續提升,汽車智能化與機器人業務多點突破

8月25日&#xff0c;全球領先的智能汽車科技解決方案提供商均勝電子&#xff08;600699.SH&#xff09;發布2025上半年業績&#xff0c;報告期內公司實現營業收入約303.47億元&#xff0c;同比增長12.07%&#xff1b;營業利潤總額約12.47億元&#xff0c;歸母凈利潤同比增長11.…

【QT入門到晉級】進程間通信(IPC)-共享內存

前言 前面分享了幾種IPC通信技術&#xff0c;都有成熟的交互機制&#xff08;阻塞和非阻塞方式交互&#xff09;&#xff0c;而本文分享的共享內存&#xff0c;更像是系統提供了一張“白紙”&#xff0c;讓多個進程自己構建管理及安全機制&#xff0c;而有些場景只需要簡單的機…

自動化測試概念與 Web 自動化實戰(基于 Selenium)

在軟件測試領域&#xff0c;自動化測試是提升測試效率、保障回歸測試質量的核心手段。尤其對于 C 開發的項目&#xff0c;自動化測試能有效減少重復手工操作&#xff0c;避免新增功能對歷史功能的影響。本文從自動化基礎概念入手&#xff0c;詳解自動化分類、Web 自動化測試核心…

NeRAF、ImVid論文解讀

目錄 一、NeRAF 1、概述 2、方法 3、訓練過程 4、實驗 二、ImVid 1、概述 2、Imvid數據集 3、STG方法 一、NeRAF 1、概述 NeRF類方法僅支持視覺合成功能&#xff0c;缺乏聲學建模能力。對于以往的聲學建模&#xff08;如NAR/INRAS&#xff09;會忽略三維場景幾何對聲…

重復文件刪除查找工具 Duplicate Files Search Link v10.7.0

軟件介紹 Duplicate Same Files Searcher 是一款面向 Windows 平臺的專業重復文件檢索與清理工具&#xff0c;兼具符號鏈接替換與 NTFS 高級特性支持&#xff0c;可在無損數據的前提下大幅縮減磁盤冗余。 軟件使用 軟件打開后是英文版&#xff0c;手動切換中文&#xff08;按…

簡易shell

目錄 一、整體功能概述 函數準備 1.env命令 2.getenv()函數 3.snprintf 4.strtok()函數 三、全局變量 四、核心功能函數解析 1. 信息獲取函數 2. 命令行交互 3. 命令解析 4. 普通命令執行 5. 內置命令處理&#xff08;核心功能&#xff09; 五、主函數流程 六、總…

網關資源權限預加載:從冷啟動阻塞到優雅上線的完整閉環

網關資源權限預加載:從冷啟動阻塞到優雅上線的完整閉環 基于 Spring Cloud Gateway + Spring Cloud Alibaba Nacos ——一篇可落地的技術方案與源碼級實現 1. 場景與痛點 在微服務網關層做 統一資源權限校驗 時,必須滿足: 啟動阻塞:所有權限規則加載完成前,不監聽端口,拒…

open webui源碼分析8—管道

我們可以把Open WebUI想象成一個管道系統&#xff0c;數據通過管道和閥門流動。管道作為open webui的插件&#xff0c;可以為數據構建新的通路&#xff0c;可以自定義邏輯和處理數據&#xff1b;閥門是管道的可配置部件&#xff0c;控制數據流過管道時的行為。管道可以理解成用…

深入理解 C 語言 hsearch 哈希表:限制、技巧與替代方案

概述 C 語言標準庫中的 hsearch 系列函數提供了一套簡單易用的哈希表實現,包含在 <search.h> 頭文件中。這組函數雖然接口簡潔,但在實際使用中存在一些重要的限制和注意事項。本文將深入探討 hsearch 的功能特點、設計局限,并提供實用的解決方案和替代建議。 hsearc…

Web網絡開發 -- HTML和CSS基礎

HTML 超文本編輯語言 HTML 介紹 HTML的英文全稱是 Hyper Text Markup Language&#xff0c;即超文本標記語言。HTML是由WEB的發明者 Tim Berners-Lee &#xff08;蒂姆伯納斯李&#xff09;和同事 Daniel W. Connolly于1990年創立的一種標記語言&#xff0c; 它是標準通用化標…

Python爬蟲實戰:研究開源的高性能代理池,構建電商數據采集和分析系統

1. 緒論 1.1 研究背景與意義 隨著互聯網技術的飛速發展,網絡數據已成為信息時代的核心資源之一。從商業角度看,企業通過分析競爭對手的產品信息、用戶評價等數據,可制定更精準的市場營銷策略;從學術研究角度,研究者通過爬取社交媒體數據、學術文獻等,可開展社會網絡分析…

項目設計文檔——爬蟲項目(爬取天氣預報)

一、項目背景以及項目意義 項目背景&#xff1a; 爬蟲技術的核心目的是自動化地從互聯網上采集&#xff0c;提取和存儲數據。網絡爬蟲是一種自動化程序&#xff0c;用于從互聯網上抓取數據并進行處理。C語言因其高效性和接近硬件的特性&#xff0c;常被用于開發高性能的網絡爬…

Python 操作 PPT 文件:從新手到高手的實戰指南

在日常工作和學習中&#xff0c;PPT 是我們展示信息和進行演示的重要工具。無論是制作報告、演講還是教學課件&#xff0c;PPT 都扮演著不可或缺的角色。然而&#xff0c;當面對大量重復性的 PPT 編輯任務時&#xff0c;手動操作不僅耗時耗力&#xff0c;還容易出錯。幸運的是&…

系統設計中的冪等性

1. 基本概念 冪等性&#xff08;Idempotence&#xff09;是系統設計中經常提到的概念。如果某個操作執行一次或多次都能產生相同的結果&#xff0c;那么它就是冪等的。2. 代碼示例 下面這段代碼是冪等的。無論你調用多少次&#xff0c;show_my_button 的最終狀態都是False。 de…

Pandas vs Polars Excel 數據加載對比報告

?? Pandas vs Polars Excel 數據加載對比報告 1. 數據基本情況 數據文件:data.xlsx 數據規模:23,670 行 3 列 字段: case_time:日期/時間 case_name:公司名稱(字符串) board:所屬板塊(字符串) 2. 加載方式與代碼 Pandas import pandas as pdfrom tools import…

Kafka 為什么具有高吞吐量的特性?

Kafka 高吞吐量原因&#xff1a;面試題總結 在面試中&#xff0c;Kafka 的高吞吐量設計是高頻考點&#xff0c;核心需圍繞“架構設計”“存儲優化”“網絡效率”“資源利用”四個維度展開&#xff0c;以下是結構化總結&#xff1a; 一、核心架構&#xff1a;并行化與分層設計分…

MCP 協議原理與系統架構詳解—從 Server 配置到 Client 應用

1. MCP MCP&#xff08;Model Context Protocol&#xff0c;模型上下文協議&#xff09;是開發 Claude 模型的(Anthropic)公司推出的一個開放標準協議&#xff0c;就像是一個 “通用插頭” 或者 “USB 接口”&#xff0c;制定了統一的規范&#xff0c;不管是連接數據庫、第三方…

uniapp安卓真機調試問題解決總結

uniapp安卓真機調試遇到各種連接不上問題&#xff1a; 手機上打開調試數據線不行&#xff0c;換數據線電腦重啟手機重啟拔出數據線&#xff0c;換個USB插口。

Linux Qt創建和調用so庫的詳細教程

一、創建so庫1.文件-->新建文件或項目-->Library->C Library&#xff0c;如下圖2.工程命名為Example3.一直下一步就可以4、工程創建完成&#xff0c;如下圖5、刪除Example_global.h6、配置.pro文件# 設置輸出目錄 DESTDIR $$PWD/output #只生成.so文件 CONFIG plugi…

【深度學習】蒙特卡羅方法:原理、應用與未來趨勢

作者選擇了由 Ian Goodfellow、Yoshua Bengio 和 Aaron Courville 三位大佬撰寫的《Deep Learning》(人工智能領域的經典教程&#xff0c;深度學習領域研究生必讀教材),開始深度學習領域學習&#xff0c;深入全面的理解深度學習的理論知識。 之前的文章參考下面的鏈接&#xf…