Linux_3:進程間通信

IPC

1.什么是IPC?Inter Process Communication

2.進程間通信常用的幾種方式

????????1,管道通信:有名管道,無名管道

????????2,信號- 系統開銷小

????????3,消息隊列-內核的鏈表

????????4,信號量-計數器

????????5,共享內存

????????6,內存映射

????????7,套接字

無名管道

管道的概念

1.本質

內核緩沖區

偽文件-不占用磁盤空間

2特點:

兩部分: 讀端,寫端,對應兩個文件描述符

數據寫端流入,讀端流出

操作管理的進程被銷毀之后,管道自動被釋放

管道默認是阻塞的

管道的原理

1.內部實現方式:

隊列-環形隊列

特點:先進先出

2.緩沖區大小

默認4K,大小會根據實際情況做適當調整

管道的局限性

1.隊列: 數據只能讀取一次,不能重復讀取

2.半雙工:

單工:遙控器

半雙工:對講機

創建匿名管道

int?pipe(int?fd[2])

fd‐傳出參數:

????????fd[0]‐讀端

????????fd[1]‐寫端

返回值:

????????0:成功

????????‐1:創建失敗

父子進程使用管道通信

實現 ps aux | grep "bash"

數據重定向:dup2

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>int main()
{int ret;int fd[2];ret = pipe(fd);if(ret == -1){printf("pipe creat failed\n");exit(1);}printf("pipe creat success!\n");printf("fd[0] is %d\n",fd[0]);printf("fd[1] is %d\n",fd[1]);close(fd[0]);close(fd[1]);return 0;
}
~         

注012是標準輸入輸出和報錯

? ? ? ?int dup2(int oldfd, int newfd);//新段指向舊端

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>int main()
{pid_t pid;int ret;int fd[2];ret = pipe(fd);if(ret == -1){printf("pipe creat failed\n");exit(1);}printf("pipe creat success!\n");pid = fork();if(pid == -1){printf("fork failed\n");exit(1);}if(pid > 0){close(fd[0]);dup2(fd[1],STDOUT_FILENO);execlp("ps","ps","aux",NULL);perror("excelp");exit(1);}else if (pid == 0){close(fd[1]);dup2(fd[0],STDIN_FILENO);execlp("grep","grep","bash","--color=auto",NULL);}return 0;
}

單個進程也可以使用管道
父子進程在使用管道的時候,父進程寫的時候要關閉讀,子進程讀的時候要關閉寫?

管道的讀寫行為

1.讀操作

? ? ? ? 1)有數據:read(fd[0]) 正常讀,返回讀出的字節數

? ? ? ? 2)無數據:

????????????????寫端被全部關閉,read返回0,相當于讀文件到了尾部

????????????????沒有全部關閉,read阻塞

2.寫操作

? ? ? ? 1)讀端全部關閉:

????????????????管道破裂,進程被終止

????????????????內核給當前進程發送信號SIGPIPE-13,默認處理動作

? ? ? ? 2)讀端沒全部關閉:

????????????????緩沖區寫滿了,write阻塞

????????????????緩沖區沒滿,write繼續寫,直到寫滿,阻塞

3.如何設置非阻塞?

1)默認讀寫兩端都阻塞

2)設置讀端為非阻塞pipe(fd):

????????fcntl-變參函數:復制文件描述符-dup;修改文件屬性-open的時候對應flag屬性

????????設置方法

//獲取原來的flags?

int?flags?=?fcntl(fd[0],F+GETFL);?

//設置新的flags?

flag?|=O_NONBLOCK;?

fcntl(fd[0],F_SETFL,flags);?

fcntl(fd[0],F_SETFL,flags);?

查看管道緩沖區大小

命令:

ulimit -a

fpathconf

? long fpathconf(int fd, int name);

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>int main()
{int ret;int fd[2];ret = pipe(fd);if(ret == -1){printf("pipe creat failed\n");exit(1);}printf("pipe creat success!\n");long size = fpathconf(fd[0],_PC_PIPE_BUF);printf("size id %ld\n",size);printf("fd[0] is %d\n",fd[0]);printf("fd[1] is %d\n",fd[1]);close(fd[0]);close(fd[1]);return 0;
}

有名管道

函數形式:int?mkfifo(const?char?\*filename,mode_t?mode);

功能:創建管道文件

參數:管道文件文件名,權限,創建的文件權限仍然和umask有關系。

返回值:創建成功返回0,創建失敗返回-1。

特點

????????有名管道

????????在磁盤上有這樣一個文件 ls -l ->p

????????也是一個偽文件,在磁盤大小永久為0

????????數據存在內核中有一個對應的緩沖區

????????半雙工通信方式

使用場景

沒有血緣關系的進程間通信

創建方式

命令:mkfifo 管道名

函數:mkfifo()

?int mkfifo(const char *pathname, mode_t mode);

fifo文件可以使用io函數進程操作

open/close,read/write

不能執行lseek操作

讀函數

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>int main()
{int ret;int fd;int nread;char readBuff[50] = {0};ret = mkfifo("/home/u/process/myfifo",0777);if(ret == -1){return -1;}printf("creat file success!\n");fd = open("./myfifo",O_RDONLY);if(fd < 0){return -1;}printf("open file success!\n");nread = read(fd,readBuff,50);printf("read %d byte from fifo :%s\n",nread,readBuff);close(fd);return 0;
}

寫程序

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>int main()
{int fd;char *str = "hello world!";fd = open("./myfifo",O_WRONLY);if(fd < 0){return -1;}printf("open file success!\n");write(fd,str,strlen(str));close(fd);return 0;
}
~      

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

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

相關文章

【Springboot】Bean解釋

在 Spring Boot 中&#xff0c;Bean 就像是你餐廳里的一名員工。比如&#xff0c;你有一名服務員&#xff08;Service&#xff09;、一名廚師&#xff08;Chef&#xff09;和一名收銀員&#xff08;Cashier&#xff09;。這些員工都是餐廳正常運轉所必需的&#xff0c;他們各自…

axios的post請求,數據為什么要用qs處理?什么時候不用?

為什么使用 qs 處理 POST 數據axios 的 POST 請求默認將 JavaScript 對象序列化為 JSON 格式&#xff08;Content-Type: application/json&#xff09;。但某些后端接口&#xff08;尤其是傳統表單提交&#xff09;要求數據以 application/x-www-form-urlencoded 格式傳輸&…

【unitrix】 4.21 類型級二進制數基本結構體(types.rs)

一、源碼 這段代碼定義了一個類型級數值系統的 Rust 實現&#xff0c;主要用于在編譯時表示和操作各種數值類型。 use crate::sealed::Sealed; use crate::number::{NonZero, TypedInt, Unsigned, Primitive}; // // 特殊浮點值枚舉 ///// 特殊浮點值&#xff08;NaN/∞&#x…

UI前端與數字孿生結合實踐案例:智慧零售的庫存管理優化系統

hello寶子們...我們是艾斯視覺擅長ui設計和前端數字孿生、大數據、三維建模、三維動畫10年經驗!希望我的分享能幫助到您!如需幫助可以評論關注私信我們一起探討!致敬感謝感恩!一、引言&#xff1a;數字孿生重構零售庫存的 “人 - 貨 - 場” 協同在零售行業利潤率持續承壓的背景…

【Freertos實戰】零基礎制作基于stm32的物聯網溫濕度檢測(教程非常簡易)持續更新中.........

本次記錄采用Freertos的第二個DIY作品&#xff0c;基于Onenet的物聯網溫濕度檢測系統&#xff0c;此次代碼依然是全部開源。通過網盤分享的文件&#xff1a;物聯網溫濕度檢測.rar 鏈接: https://pan.baidu.com/s/1uj9UURVtGE6ZB6OsL2W8lw?pwdqm2e 提取碼: qm2e 大家也可以看看…

Matplotlib-多圖布局與網格顯示

Matplotlib-多圖布局與網格顯示一、多圖布局的核心組件二、基礎布局&#xff1a;plt.subplots()快速創建網格1. 均等分網格2. 不等分網格&#xff08;指定比例&#xff09;三、進階布局&#xff1a;GridSpec實現復雜嵌套1. 跨行列布局2. 嵌套GridSpec四、實用技巧&#xff1a;布…

GitHub上優秀的開源播放器項目介紹及優劣對比

ExoPlayer 項目地址:https://github.com/google/ExoPlayer 特點: 由Google開發,支持廣泛的視頻格式和流媒體傳輸協議,如DASH、HLS、SmoothStreaming。 提供靈活的媒體源架構和高級特性,如動態自適應流播放。 開發者可以輕松擴展和定制播放器組件,適應特定需求。 優點: 功…

react打包發到線上報錯Minified React error #130

開發過程中遇到一個問題&#xff0c;記錄一下 本地打包發布正常&#xff0c;發測試環境正常&#xff0c;可是通過Jenkins打包發布線上報錯 報錯信息 index-67fbbd81.js:39 Error: Minified React error #130; visit https://reactjs.org/docs/error-decoder.html?invariant130…

微服務項目遠程調用時的負載均衡是如何實現的?

負載均衡概述 負載均衡是微服務架構中的核心組件&#xff0c;用于將請求合理分配到多個服務實例上&#xff0c;提高系統的可用性和性能。負載均衡的分類 負載均衡大致可以分為兩類 1. 服務端負載均衡 實現位置&#xff1a;獨立部署的負載均衡服務器&#xff08;位于客戶端和服務…

【中文核心期刊推薦】中國農業科技導報

《中國農業科技導報》是中國科技核心期刊&#xff0c;也是北京大學圖書館“中文核心期刊要目總覽”收錄的期刊。它是由中國農村技術開發中心主辦&#xff0c;全面為科教興農服務的綜合性農業學術期刊。&#xfeff;《中國農業科技導報》是中國農業科學院生物技術研究所承辦的&a…

php 如何通過mysqli操作數據庫?

在PHP中&#xff0c;mysqli&#xff08;MySQL Improved Extension&#xff09;是操作MySQL數據庫的擴展庫&#xff0c;提供了面向對象和過程式兩種風格。以下是mysqli的基本操作方法&#xff1a; 1. 連接數據庫 面向對象風格 $mysqli new mysqli(localhost, username, passwor…

c/c++拷貝函數

memcpy()函數概要原型void * memcpy ( void * dest, const void * src, size_t num );功能memcpy()會復制 src 所指的內存內容的前 num 個字節到 dest所指的內存地址上&#xff08;memcpy()并不關心被復制的數據類型&#xff0c;只是逐字節地進行復制&#xff0c;這給函數的使用…

HTTP核心基礎詳解(附實戰要點)

目錄 一圖勝千言&#xff1a;HTTP核心機制圖解?編輯 一、HTTP本質&#xff1a;通信的橋梁 二、五大核心特性解析 三、HTTP頭部&#xff1a;隱藏的控制中心 四、連接管理&#xff1a;性能關鍵點 開發者必知實踐技巧 一圖勝千言&#xff1a;HTTP核心機制圖解 一、HTTP本質…

華為靜態路由配置

問題描述&#xff1a;針對兩臺筆記本和兩個路由器在不同的網段場景中&#xff0c;對兩個路由器進行靜態路由配置。下面以如下場景為例&#xff0c;介紹詳細配置過程。配置步驟&#xff1a; 1、對每個路由器的接口下配置IP地址 [huawei]interface gx/x/x [huawei-interface]ip a…

閑庭信步使用圖像驗證平臺加速FPGA的開發:第八課——圖像數據的行緩存

&#xff08;本系列只需要modelsim即可完成數字圖像的處理&#xff0c;每個工程都搭建了全自動化的仿真環境&#xff0c;只需要雙擊文件就可以完成整個的仿真&#xff0c;大大降低了初學者的門檻&#xff01;&#xff01;&#xff01;&#xff01;如需要該系列的工程文件請關注…

經典排序算法

文章目錄前言1. 排序的基本概念1.1 排序是什么&#xff1f;1.2 常見的排序算法概覽2. 常見排序算法的實現2.1 插入排序 (Insertion Sort)2.1.1 基本思想2.1.2 直接插入排序2.1.3 希爾排序 (Shell Sort)2.2 選擇排序 (Selection Sort)2.2.1 直接選擇排序2.2.2 堆排序 (Heap Sort…

RabbitMQ 消息隊列:從入門到Spring Boot實戰

RabbitMQ 作為一款開源的、基于 AMQP&#xff08;Advanced Message Queuing Protocol&#xff09;協議實現的消息代理&#xff0c;憑借其強大的功能、靈活的路由機制以及出色的性能&#xff0c;在業界得到了廣泛的應用。無論是處理高并發訂單、異步通知、日志收集還是系統解耦&…

代賬行業數字化破局:從“知道”到“做到”,三步走穩贏!

認知&#xff01;降本&#xff01;增收&#xff01;數字化&#xff01;——這不僅是口號&#xff0c;更是代賬行業在激烈競爭和時代變化中生存發展的關鍵。很多代賬同行其實都明白趨勢&#xff0c;也知道大概該怎么做。但問題卡在第一步&#xff1a;不知道怎么開始&#xff0c;…

Mac 電腦crontab執行定時任務【Python 實戰】

1、crontab -e 編輯定時任務列表 crontab -e查看當前定時任務列表,長按 i 編輯,編輯完之后按 esc 退出編輯,然后輸入:wq 保存并提出。 如下: (base) charles@zl ~ % crontab -e58 15 * * * /Library/Frameworks/Python.framework/Versions/3.8/bin/python3 /Users/charle…

go go go 出發咯 - go web開發入門系列(三) 項目基礎框架搭建與解讀

go go go 出發咯 - go web開發入門系列&#xff08;三&#xff09; 項目基礎框架搭建與解讀 往期回顧 go go go 出發咯 - go web開發入門系列&#xff08;一&#xff09; helloworldgo go go 出發咯 - go web開發入門系列&#xff08;二&#xff09; Gin 框架實戰指南 前言 如…