C語言中的進程、線程與進程間通信詳解

目錄

引言

基本概念

1. 進程(Process)

2. 線程(Thread)

線程編程實戰

1. 常見線程庫

2. 合理設置線程數

3. pthread 創建線程

線程同步機制

1. 互斥鎖 pthread_mutex_t

2. 條件變量 pthread_cond_t

3. 讀寫鎖 pthread_rwlock_t

進程的創建與控制

1. fork

2. exec

3. system

4. popen 管道讀取輸出

進程間通信 IPC 詳解

1. 方式對比表:

2. 信號 signal

3. 共享內存 POSIX

總結


引言

本文深入探討了 C 語言中多線程編程、進程間通信(IPC)機制的底層實現,涵蓋線程同步、信號量、互斥鎖、共享內存等關鍵知識,并通過實際任務案例帶你走進操作系統世界中的“線程宇宙”

基本概念

1. 進程(Process)

程序的一次執行過程,是操作系統進行資源分配的最小單位。

  • 一個程序至少有一個進程。

  • 每個進程有自己的 地址空間資源集合執行上下文

進程分類:

  • 前臺進程

  • 后臺進程

  • 服務進程(如守護進程)

運行在服務器上一般都是守護進程。

2. 線程(Thread)

線程是進程中獨立的執行單元,是程序執行的最小單位。

  • 一個進程至少有一個主線程(main thread)。

  • 多個線程共享該進程的地址空間和資源。

  • 線程擁有自己的 棧空間寄存器上下文

線程編程實戰

1. 常見線程庫

  • POSIX Thread:pthread(C語言中最常用)

  • OpenMP:并行處理,適合 C/C++

  • C++11 std::thread(不在本文范圍)

2. 合理設置線程數

// CPU 密集型:核心線程數 ≈ CPU數 + 1
// IO 密集型:核心線程數 ≈ ((線程等待時間 / 線程CPU時間) + 1) * CPU數

3. pthread 創建線程

#include <pthread.h>void *thread_func(void *arg) {printf("This is a new thread\n");return NULL;
}int main() {pthread_t tid;pthread_create(&tid, NULL, thread_func, NULL);pthread_join(tid, NULL);  // 等待線程結束return 0;
}

線程同步機制

線程同時訪問共享資源時容易引發競態條件,需進行同步。

1. 互斥鎖 pthread_mutex_t

  • pthread_mutex_init

  • pthread_mutex_lock

  • pthread_mutex_unlock

  • pthread_mutex_destroy

2. 條件變量 pthread_cond_t

用于線程間等待與喚醒的機制。

pthread_cond_t cond;
pthread_mutex_t mutex;pthread_cond_init(&cond, NULL);
pthread_mutex_lock(&mutex);
pthread_cond_wait(&cond, &mutex);     // 釋放鎖并阻塞
pthread_cond_signal(&cond);           // 喚醒一個線程
pthread_mutex_unlock(&mutex);

3. 讀寫鎖 pthread_rwlock_t

適用于讀多寫少的場景。

pthread_rwlock_t rwlock;
pthread_rwlock_init(&rwlock, NULL);pthread_rwlock_rdlock(&rwlock);  // 讀鎖
pthread_rwlock_unlock(&rwlock);pthread_rwlock_wrlock(&rwlock);  // 寫鎖
pthread_rwlock_unlock(&rwlock);

進程的創建與控制

1. fork

克隆當前進程,創建子進程。

pid_t pid = fork();
if (pid == 0) {// 子進程
} else {// 父進程
}

2. exec

用新程序替換當前進程的映像。

execl("/bin/ls", "ls", "-l", NULL);

3. system

執行 shell 命令,本質是 fork + exec 的封裝。

system("ls -l");

4. popen 管道讀取輸出

進程間通信 IPC 詳解

1. 方式對比表:

方式特點是否跨進程是否阻塞適用場景
管道簡單易用父子進程
信號異步通知機制異常處理
信號量原子性控制多進程同步
共享內存訪問速度最快大數據共享
消息隊列異步通信有序通信
套接字網絡/本地通信是/否客戶端/服務端通信

2. 信號 signal

#include <signal.h>void handler(int sig) {printf("Caught signal %d\n", sig);
}int main() {signal(SIGINT, handler); // 注冊 ctrl+C 的信號處理while (1) pause();
}

3. 共享內存 POSIX

#include <fcntl.h>
#include <sys/mman.h>
#include <unistd.h>int fd = shm_open("/shm_name", O_CREAT | O_RDWR, 0666);
ftruncate(fd, 4096);
void *ptr = mmap(NULL, 4096, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);// 寫入共享內存
strcpy((char*)ptr, "Hello from shared memory");munmap(ptr, 4096);
close(fd);
shm_unlink("/shm_name");

總結

通過本文的學習,我們系統掌握了 C 語言中進程與線程的基本概念、線程創建與同步的編程方法,以及多種進程間通信(IPC)機制,包括信號、共享內存、信號量等。進程負責資源的獨立管理,線程則提供更輕量級的并發執行方式;同步機制確保了多線程環境下數據的一致性,而 IPC 則使得多個進程間能夠高效協作與通信。結合實際案例,我們不僅加深了對操作系統底層原理的理解,也提升了并發編程與系統開發的能力。對于從事系統編程、服務器開發或學習操作系統的同學,這些內容都是必不可少的核心知識。

更多代碼可以觀看:Niuer_C: C語言學習?0711-0721

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

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

相關文章

[假面騎士] 555淺談

假面騎士555(faiz)是我最先接觸的一部平成系列的假面騎士&#xff0c;同時也是我個人最喜歡的一部假面騎士。一、大綱簡介震驚&#xff0c;人類最新的進化形態——奧菲一諾&#xff0c;橫空出世&#xff01;日本的頂級財團&#xff0c;Smart Brain&#xff0c;的前任社長&#…

Vue Router 路由的創建和基本使用(超詳細)

一、路由的基本概念 你是否好奇單頁應用&#xff08;SPA&#xff09;是如何在不刷新頁面的情況下實現頁面切換的&#xff1f;這就離不開路由的功勞。 路由&#xff1a;本質是一組 key-value 的對應關系&#xff0c;在前端領域中&#xff0c;key 通常是路徑&#xff0c;value …

深入理解設計模式:策略模式的藝術與實踐

在軟件開發中&#xff0c;我們經常會遇到需要根據不同情況選擇不同算法或行為的場景。傳統的做法可能是使用大量的條件語句&#xff08;if-else或switch-case&#xff09;&#xff0c;但隨著需求的增加和變化&#xff0c;這種硬編碼的方式會導致代碼難以維護和擴展。策略模式&a…

概率/期望 DP llya and Escalator

題目鏈接&#xff1a;Problem - D - Codeforces 看了這篇文章來的&#xff1a;【算法學習筆記】概率與期望DP - RioTian - 博客園 這篇博客寫得挺好的&#xff0c;講了一些常見方法&#xff0c;概率 / 期望的題多練練就上手了。 題目大意&#xff1a; n 個人排隊上電梯&…

大陸電子MBDS開發平臺轉到其他國產控制器平臺產生的問題記錄

u8_StComLowSpdGearSwt變量為例&#xff0c;之前用的時候只有輸入&#xff0c;沒什么實際意義&#xff0c;導致新環境下編譯報錯&#xff0c;缺少聲明&#xff0c;解決辦法&#xff1a;注釋掉輸入模塊。今天解決的另一個比較大的問題&#xff0c;不同模型函數公用函數模塊生成代…

機器學習模型調優實戰指南

文章目錄模型選擇與調優&#xff1a;從理論到實戰1. 引言2. 模型評估&#xff1a;為選擇提供依據2.1 偏差-方差權衡2.2 數據集劃分與分層抽樣2.3 交叉驗證&#xff08;Cross-Validation&#xff09;2.4 信息準則&#xff08;AIC / BIC&#xff09;3. 超參數調優&#xff1a;讓模…

【教程】Unity CI/CD流程

測試機&#xff1a;紅帽 Linux8 源碼倉庫&#xff1a;Gitee - MrRiver/Unity Example ? 系統環境準備 1&#xff09;yum 源 sudo curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-8.repo sudo sed -i s/\$releasever/8/g /etc/yum.repos…

文獻閱讀 | Briefings in Bioinformatics | Hiplot:全面且易于使用的生物醫學可視化分析平臺

文獻介紹文獻題目&#xff1a; Hiplot&#xff1a;一個綜合且易于使用的 Web 服務&#xff0c;用于增強出版物準備的生物醫學數據可視化 研究團隊&#xff1a; Openbiox/Hiplot 社區 發表時間&#xff1a; 2022-07-05 發表期刊&#xff1a; Briefings in Bioinformatics 影響因…

【數字圖像處理系列筆記】Ch04:灰度變換與空間域圖像增強(2)

目錄 一、空域濾波基礎 一、空域濾波的基本概念 二、空域濾波的數學原理 三、空域濾波器的分類與典型示例 &#xff08;一&#xff09;線性濾波器&#xff08;Linear Filter&#xff09; &#xff08;二&#xff09;非線性濾波器&#xff08;Non-linear Filter&#xff0…

AI浪潮下,FPGA如何實現自我重塑與行業變革

引言&#xff1a;AI 與 FPGA&#xff0c;新時代的碰撞 2025 年&#xff0c;人工智能技術迎來爆發式增長&#xff0c;大模型、生成式 AI 和多模態技術持續突破&#xff0c;人形機器人量產元年正式開啟&#xff0c;自動駕駛商業化進程加速&#xff0c;工業數字化轉型全面鋪開(1)…

系統集成項目管理工程師【第十一章 規劃過程組】定義范圍、創建WBS、規劃進度管理和定義活動篇

系統集成項目管理工程師【第十一章 規劃過程組】定義范圍、創建WBS、規劃進度管理和定義活動篇 一、定義范圍&#xff1a;給項目畫好"邊界線" 定義范圍是明確項目和產品"做什么、不做什么"的過程&#xff0c;直接影響后續所有工作的方向。 1. 核心概念與作…

Spring Boot 參數校驗全指南

Spring Boot 參數校驗全指南 在 Web 開發中&#xff0c;參數校驗是保障接口安全性和數據合法性的關鍵環節。手動編寫校驗邏輯不僅繁瑣&#xff0c;還容易遺漏邊界情況。Spring Boot 整合了 validation 工具&#xff0c;提供了一套簡潔高效的參數校驗方案&#xff0c;可快速實現…

常用技術資料鏈接

1.team技術 https://zhuanlan.zhihu.com/p/11389323664 https://blog.csdn.net/Lucky_Lu0/article/details/121697151 2.bond切換主備 https://www.xgss.net/3306.html 3.ssh詳解&#xff1a; https://cloud.tencent.com/developer/news/105165 https://blog.huochengrm.c…

【Spring Cloud】-- 注冊中心

文章目錄1. 什么是注冊中心2. CPA理論1. 什么是注冊中心 注冊中心有三種角色&#xff1a; 服務提供者&#xff08;Server&#xff09; &#xff1a;提供接口給其他微服務的程序。服務消費者&#xff08;Client&#xff09;&#xff1a;調用其他微服務提供的接口。**服務注冊中…

go-zero 詳解

go-zero 詳解 go-zero 是一個基于 Go 語言的微服務框架&#xff0c;由字節跳動團隊開發并開源&#xff0c;旨在幫助開發者快速構建高可用、高性能的微服務架構。它集成了豐富的組件&#xff0c;簡化了微服務開發中的常見問題&#xff08;如服務注冊發現、配置管理、限流熔斷等&…

接口自動化框架封裝之統一請求封裝及通過文件實現接口關聯

接口自動化測試框架封裝目的:簡化自動化框架的落地,提高投入和產出比,只要一個人封裝好框架,另外的測試通過寫yaml測試用例即可實現接口自動化1.統一請求的封裝去除多余重復的代碼可跨py文件實現通過一個session來自動關聯有cookie的接口設置統一公共參數,統一文件處理,統一異常…

Vue 最佳實踐:如何利用唯一 key 值保證 el-table 動態渲染的穩定性

&#x1f4cb; 問題描述 在Vue 2.0 ElementUI項目的偏置條件管理頁面中&#xff0c;每次切換到"內規拉偏"菜單時&#xff0c;表格樣式會發生崩潰&#xff0c;導致表格布局異常、列寬錯亂、固定列顯示不正確等問題。 &#x1f50d; 問題分析 通過深入分析代碼&#x…

popen開啟進程,寫入數據

通過管道&#xff08;popen&#xff09;啟動 SDIWAN_WEB 進程并寫入 JSON 數據的過程可以分為以下步驟&#xff0c;結合代碼示例和關鍵注意事項進行說明&#xff1a;1. 核心代碼示例 #include <stdio.h> #include <json-c/json.h>int main() {// 1. 創建 JSON 對象…

計算機視覺的四項基本任務辨析

計算機視覺是使計算機能理解采集設備采集的圖像視頻的一門學科&#xff0c;目的是讓計算機實現人的視覺功能——對客觀世界的三維場景的感知、識別和理解。換句話說&#xff0c;要讓計算機具備通過二維圖像認識三維環境的能力。 目錄 三個階段 視覺層級 基本任務 技術難點…

iostat 系統IO監控命令學習

一、iostat 命令描述 “iostat”命令用于監測系統輸入/輸出設備的負載情況&#xff0c;其通過觀察設備處于活躍狀態的時間與平均傳輸速率之間的關系來實現這一目的。該命令會生成報告&#xff0c;這些報告可用于調整系統配置&#xff0c;以更好地平衡物理磁盤之間的輸入/輸出負…