linux C 語言開發 (八) 進程基礎

???文章的目的為了記錄使用C語言進行linux?開發學習的經歷。開發流程和要點有些記憶模糊,趕緊記錄,防止忘記。

相關鏈接:

linux C 語言開發 (一) Window下用gcc編譯和gdb調試

linux C 語言開發 (二) VsCode遠程開發 linux

linux C 語言開發 (三) 建立云服務器

linux C 語言開發 (四) linux系統常用命令

linux C 語言開發 (五) linux系統目錄結構

linux C 語言開發 (六) 程序的編輯和編譯(vim、gcc)

linux C 語言開發 (七) 文件 IO 和標準 IO

linux C 語言開發 (八) 進程基礎

linux C 語言開發 (九) 進程間通訊--管道

linux C 語言開發 (十) 進程間通訊--信號

Linux C到Android App開發推薦鏈接(入門十二章):

開源 java android app 開發(一)開發環境的搭建_csdn 開源 java android app-CSDN博客

開源 java android app 開發(一)開發環境的搭建-CSDN博客

開源 java android app 開發(二)工程文件結構-CSDN博客

開源 java android app 開發(三)GUI界面布局和常用組件-CSDN博客

開源 java android app 開發(四)GUI界面重要組件-CSDN博客

開源 java android app 開發(五)文件和數據庫存儲-CSDN博客

開源 java android app 開發(六)多媒體使用-CSDN博客

開源 java android app 開發(七)通訊之Tcp和Http-CSDN博客

開源 java android app 開發(八)通訊之Mqtt和Ble-CSDN博客

開源 java android app 開發(九)后臺之線程和服務-CSDN博客

開源 java android app 開發(十)廣播機制-CSDN博客

開源 java android app 開發(十一)調試、發布-CSDN博客

開源 java android app 開發(十二)封庫.aar-CSDN博客

linux C到.net mvc開發推薦鏈接:

開源C# .net mvc 開發(一)WEB搭建_c#部署web程序-CSDN博客

開源 C# .net mvc 開發(二)網站快速搭建_c#網站開發-CSDN博客

開源 C# .net mvc 開發(三)WEB內外網訪問(VS發布、IIS配置網站、花生殼外網穿刺訪問)_c# mvc 域名下不可訪問內網,內網下可以訪問域名-CSDN博客

開源 C# .net mvc 開發(四)工程結構、頁面提交以及顯示_c#工程結構-CSDN博客

開源 C# .net mvc 開發(五)常用代碼快速開發_c# mvc開發-CSDN博客、

內容:講述進程的基礎知識,進程就是正在運行的程序。講述如何創建,運行種類等。

目錄:

1.創建

2.執行

3.命令

4.種類

一、創建

????????所有的進程都是由其他進程創建(除了 pid 為 0 號的 idle 進程) , pid 號為 1 的 init 進程是系統啟動后運行的第一個進程, 是所有進程的父進程, init 進程會初始化一部分系統服務, 創建其他進程。

????????創建新進程的那個進程稱為父進程, 新進程稱為子進程, 父進程和子進程擁有相同的代碼段數據段,有各自獨立的地址空間。 采用寫時拷貝技術, 即創建的新進程不會立即把父進程的資源空間復制過來, 只有在修改時才會復制資源, 另外父進程掛起的信號和文件鎖不會被子進程繼承。

????????子進程結束后, 它的父進程要回收它的資源, 否則就會成為僵尸進程 。

????????如果父進程先結束, 子進程會被 init 進程收養, 稱為孤兒進程

頭文件#include <sys/types.h> #include <unistd.h>
函數pid_t getpid(void);
返回值PID 號
功能獲取此進程 PID

頭文件#include <sys/types.h> #include <unistd.h>
函數pid_t getppid(void);
返回值PID 號
功能獲取父進程 PID

頭文件#include <unistd.h>
函數pid_t fork(void);
返回值調用成功父進程返回子進程號, 子進程返回 0, 失敗返回-1。
功能系統調用, 創建一個進程

#include <stdio.h>
#include <unistd.h>
int main(void)
{
pid_t pid;
pid = fork();
if (pid < 0)
{
printf("fork is error \n");
return -1;
} 
//父進程
if (pid > 0)
{
printf("This is parent,parent pid is %d\n", getpid());
} 
//子進程
if (pid == 0)
{
printf("This is child,child pid is %d,parent pid is %d\n", getpid(), get
ppid());
} 
return 0;
}

執行后的效果

二、執行

用 fork 函數創建子進程后, 子進程往往要調用一種 exec 函數以執行另一個程序, 該子進程被新的程序替換, 改變地址空間, 進程映像和一些屬性, 但是 pid 號不變。

函數int execve(const char *filename, char *const argv[], char *const envp[]);
頭文件#include <unistd.h>
參數 filename路徑名, 表示載入進程空間的新程序路徑。
參數 argv[]命令行參數, argv[0]為命令名
參數 envp[]新程序的環境變量
返回值成功時不會返回, 使用時不用檢查返回值, 可通過 errno 檢查。

以下函數都是根據 execve 實現:

int execl(const char *path, const char *arg, .../* (char *) NULL */);

int execlp(const char *file, const char *arg, .../* (char *) NULL */);

int execle(const char *path, const char *arg, .../*, (char *) NULL, char * const envp[] */);

int execv(const char *path, char *const argv[]);

int execvp(const char *file, char *const argv[]);

int execvpe(const char *file, char *const argv[],char *const envp[]);

演示代碼

執行execl,創建execl_sub

execl代碼

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main(void)
{
int i=0;
pid_t pid;
pid = fork();
if (pid < 0)
{
printf("fork is error \n");
return -1;
} /
/父進程
if (pid > 0)
{
printf("This is parent,parent pid is %d\n", getpid());
} /
/子進程
if (pid == 0)
{
printf("This is child,child pid is %d\n", getpid(), getppid());
//改為自己的路徑
execl("/home/samba/linux/15/hello","hello",NULL);
exit(1);
} i
++;
printf("i is %d\n",i);
return 0;
}

execl_sub代碼

#include <stdio.h>
#include <unistd.h>
int main(void)
{
printf("hello world\n");
return 0;
}

演示效果

三、命令

進程常用命令為ps和kill

ps 命令: ps 命令可以列出系統中當前運行的那些進程。

命令格式: ps [參數]

命令功能: 用來顯示當前進程的狀態常用參數: aux

kill 命令: kill 命令用來殺死進程舉例: kill -9(SIGKILL) PID

進程的狀態

D: 無法中斷的休眠狀態 (通常 IO 的進程)
R: 正在執行中
S: 靜止狀態
T: 暫停執行
Z: 不存在但暫時無法消除
W: 沒有足夠的記憶體分頁可分配
<: 高優先序的行程
N: 低優先序的行程
L: 有記憶體分頁分配并鎖在記憶體內 (實時系統或捱 A I/O)

顯示所有進程

ps -aux

查找進程

ps aux | grep test

殺死進程

kill -9(SIGKILL) PID

四、種類

孤兒進程: 父進程結束以后, 子進程還未結束, 這個子進程就叫做孤兒進程。

僵尸進程: 子進程結束以后, 父進程還在運行, 但是父進程不去釋放進程控制塊, 這個子進程就叫做僵尸進程。

守護進程(daemon)是一類在后臺運行的特殊進程, 用于執行特定的系統任務。 很多守護進程在系統引導的時候啟動, 并且一直運行直到系統關閉。 另一些只在需要的時候才啟動, 完成任務后就自動結束
?

要防止僵尸進程可以使用wait函數

wait()函數一般用在父進程中等待回收子進程的資源, 而防止僵尸進程的產生

函數pid_t wait(int *status)
頭文件#include <sys/wait.h>
返回值成功返回回收的子進程的 pid, 失敗返回-1

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

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

相關文章

從零學算法1094

1094.拼車 車上最初有 capacity 個空座位。車 只能 向一個方向行駛&#xff08;也就是說&#xff0c;不允許掉頭或改變方向&#xff09; 給定整數 capacity 和一個數組 trips , trips[i] [numPassengersi, fromi, toi] 表示第 i 次旅行有 numPassengersi 乘客&#xff0c;接他…

B2B企業營銷型AI Agent服務商推薦:誰更專業?如何選型?

一、引言&#xff1a;為什么B2B企業需要營銷型AI Agent&#xff1f;在當前競爭激烈的B2B市場中&#xff0c;企業普遍面臨幾大挑戰&#xff1a;線索獲取難&#xff1a;獲客成本持續上升&#xff0c;高質量線索難以篩選。銷售周期長&#xff1a;從初步接觸到簽單&#xff0c;往往…

算法-雙指針5.6

目錄 &#x1f33f;力扣611-有效三角形得個數 &#x1f9ca;題目鏈接&#xff1a;https://leetcode.cn/problems/valid-triangle-number/description/ &#x1f9ca;題目描述&#xff1a;?編輯 &#x1f9ca;解題思路&#xff1a; &#x1f9ca;解題代碼&#xff1a; &a…

超參數自動化調優指南:Optuna vs. Ray Tune 對比評測

點擊 “AladdinEdu&#xff0c;同學們用得起的【H卡】算力平臺”&#xff0c;注冊即送-H卡級別算力&#xff0c;80G大顯存&#xff0c;按量計費&#xff0c;靈活彈性&#xff0c;頂級配置&#xff0c;學生更享專屬優惠。 引言&#xff1a;從"手動煉丹"到"自動化…

軟考-局域網基礎考點總結

這篇文章用于整理軟考網絡相關的知識點&#xff0c;囊括了詳細的局域網基礎的考點&#xff0c;能夠讓你認真備考&#xff0c;基礎知識一網打盡&#xff0c;讓后續的學習更加通暢~ 第一部分&#xff1a;OSI七層參考模型 OSI(Open System Interconnection)模型是一個理論框架&am…

Node.js核心模塊介紹

1. fs 模塊fs&#xff08;File System&#xff09;模塊允許對文件系統進行操作&#xff0c;提供了文件讀寫、文件夾操作等功能。fs 支持同步和異步兩種 API。1.1. 常用方法讀取文件&#xff1a;異步: fs.readFile()同步: fs.readFileSync()寫入文件&#xff1a;異步: fs.writeF…

緩存三大劫攻防戰:穿透、擊穿、雪崩的Java實戰防御體系(二)

第二部分&#xff1a;緩存擊穿——熱點key過期引發的“DB瞬間高壓” 緩存擊穿的本質是“某個熱點key&#xff08;高并發訪問&#xff09;突然過期”&#xff0c;導致大量請求在同一時間穿透緩存&#xff0c;集中沖擊DB&#xff0c;形成“瞬間高壓”。 案例3&#xff1a;電商秒殺…

Linux相關概念和易錯知識點(45)(網絡層、網段劃分)

目錄1.網絡層&#xff08;1&#xff09;IP協議頭格式&#xff08;2&#xff09;工作流程2.網段劃分&#xff08;1&#xff09;五類地址&#xff08;2&#xff09;回環地址&#xff08;3&#xff09;網段的特殊地址&#xff08;4&#xff09;網絡建設我們前面暫時跳過了網絡層&a…

transition(過渡)和animation(動畫)——CSS

1.transition過渡可以為一個元素在不同狀態之間進行切換時添加過渡效果&#xff0c;實現不同狀態間的變化效果。通過觸發事件(鼠標懸停、點擊等)&#xff0c;在兩個狀態間切換。1.1 使用語法&#xff1a;transition: [property] [duration] [timing-function] [delay];property…

Spring Cloud項目國產化改造MySQL遷移達夢數據庫,SQL變更

達夢數據庫下載地址&#xff1a;https://eco.dameng.com/download 達夢數據庫安裝文檔&#xff1a;https://eco.dameng.com/document/dm/zh-cn/start/dm-install-linux.html 數據遷移SQLark工具使用 首先&#xff0c;本次MySQL遷移使用了SQLark工具 1.下載安裝SQLark https…

Cesium---1.133版本不修改源碼支持arcgis MapServer 4490切片

參照了這篇博文&#xff1a;https://blog.csdn.net/qq_19689967/article/details/121449888https://blog.csdn.net/qq_19689967/article/details/121449888 利用新版本的源碼進行了修改&#xff0c;可以實現服務加載&#xff1a; Event.js import { Check,defined} from &qu…

迭代器和生成器的區別與聯系

目錄 1.可迭代對象 (Iterable) 2.迭代器 (Iterator) 3.生成器 (Generator) 3.1生成器函數 vs 生成器表達式 4.三者之間的聯系與區別 5.關系圖&#xff08;幫助你一眼看懂&#xff09; 6.核心結論&#xff08;記住這三句話&#xff09; 1.可迭代對象 (Iterable) 定義&…

Dropout:深度學習中的隨機丟棄正則化技術

本文由「大千AI助手」原創發布&#xff0c;專注用真話講AI&#xff0c;回歸技術本質。拒絕神話或妖魔化。搜索「大千AI助手」關注我&#xff0c;一起撕掉過度包裝&#xff0c;學習真實的AI技術&#xff01; 1 什么是Dropout&#xff1f; Dropout是深度學習中最廣泛使用的正則化…

vue2遷移到vite[保姆級教程]

vue2遷移到vite[保姆級教程]使用vue CLI創建項目進行vite遷移詳細步驟1. 安裝 Vite 和 Vue 2 支持插件2. 創建 vite.config.js3. 修改 package.json 腳本4. 創建 index.html5. 確保 main.js 正確引入6. 處理靜態資源7. 構建優化&#xff08;可選&#xff09;8. 啟動項目常見問題…

瀏覽器輸入URL回車

一&#xff0c;URL解析瀏覽器會對輸入的 URL&#xff08;統一資源定位符&#xff09; 進行拆解&#xff0c;搞清楚 “目標是誰、要獲取什么資源https://www.baidu.com/s?wdCDN 拆解后&#xff1a;協議&#xff08;Scheme&#xff09;&#xff1a;https&#xff08;加密通信協議…

leedcode 算法刷題第三十四天

198. 打家劫舍 class Solution { public:int rob(vector<int>& nums) {if(nums.size()0){return 0;}else if(nums.size()1){return nums[0];}else if(nums.size()2){return max(nums[0],nums[1]);}vector<int> dp(nums.size()1,0);dp[0] nums[0];dp[1] nums…

計算機網絡(二)物理層數據鏈路層

&#xff08;物理層、數據鏈路層... 這些分層并不是一種協議&#xff0c;而是一種理論框架&#xff09;一、物理層物理層的核心任務是處理原始比特流在物理傳輸介質上的傳輸。 主要任務物理層的主要任務可以概括為以下幾點&#xff0c;它們是確保數據能在網絡硬件間可靠傳輸的基…

android13修改WiFi掃描二維碼識別識別成功率不高的問題

Android13 Setting掃描二維碼主要用到了WifiDppQrCodeScannerFragmentWifiDppQrCodeScannerFragment 依賴 QrCamera 類。QrCamera 使用了 Camera1 的API。開發了新類 ModernQrScanner &#xff0c;采用了Camera2和更新了最新的Zxing包。添加一個新的二維碼掃描的處理類&#…

AI賦能與敏捷融合:未來電源項目管理者的角色重塑與技能升級——從華為實戰看高技術研發項目的管理變革

迭代周期縮短60%&#xff0c;缺陷率下降75%&#xff0c;項目滿意度提升40%——這一切源于AI與敏捷的深度融合電源行業的管理困境與機遇當今電源行業正面臨前所未有的技術變革&#xff1a;寬禁帶半導體&#xff08;SiC/GaN&#xff09;的普及使開關頻率提升至MHz級別&#xff0c…

Dify插件安裝

Dify插件安裝 官網&#xff1a;https://docs.dify.ai/zh-hans/plugins/quick-start/install-plugins1.4.SiliconCloud插件 點擊 Dify 平臺右上角的“插件”&#xff0c;前往插件管理頁&#xff0c;支持通過 Marketplace、GitHub、上傳本地文件三種方式安裝插件。 Marketplace 你…