久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

Linux進程間通信的方式是什么

153次閱讀
沒有評論

共計 2421 個字符,預計需要花費 7 分鐘才能閱讀完成。

本篇內容主要講解“Linux 進程間通信的方式是什么”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓丸趣 TV 小編來帶大家學習“Linux 進程間通信的方式是什么”吧!

·進程間通信:操作系統為系統提供的用于實現進程間通信的方式

進程之間是無法直接通信的,因為每個進程都有獨立的虛擬地址空間,訪問的都是自己的虛擬地址,因此進程具有獨立性,無法直接通信

根據通信場景的不同,因此提供了多種不同的通信方式

進程間通信方式種類:管道、共享內存、消息隊列、信號量

·管道

特性:半雙工通信 – 可以選擇方向的單向通信

本質:在內核中開辟一塊緩沖區(內核空間中的一塊內存)

原理:多個進程通過訪問同一塊內核中的緩沖區實現通信(復制緩沖區的操作句柄)

分類:匿名管道:緩沖區沒有標識符,只能用于具有親緣關系的進程間通信

命名管道:緩沖區具有標識符,可用于同一主機上任意的進程間通信

linux 下一切皆文件 – 所有東西都是當做文件一樣進行操作(包括管道),通過 IO 操作完成對管道的訪問

·匿名管道

返回值:成功返回 0;失敗返回 -1

特性:只能用于具有親緣關系的進程間通信

匿名管道沒有標識符,無法被其他進程找到,只能通過子進程復制父進程的方式獲取到操作句柄實現通信

讀寫特性:若管道中沒有數據,則 read 會阻塞

        若管道中數據滿了,則 write 會阻塞

        所有的管道的讀端被關閉,則繼續 write 則會觸發異常,導致進程崩潰退出

        所有的管道的寫端被關閉,則繼續 read 則會讀完數據后返回 0,不再阻塞

    注:管道是半雙工通信,在通信時,一旦選定了 方向,應將不使用的那一端關閉。

· 命名管道:本質是 內核中的一塊緩沖區,具有標識符,可以被其他進程找到,因此可用于同一主機上的任意進程間通信

命名管道的標識符就是一個可見于文件系統的管道類型文件

多個進程通過打開同一個管道文件,訪問同一塊內核中的緩沖區實現通信

命令操作:mkfifo  filename 創建一個命名管道文件

函數操作:int mkfifo(const char *pathname, mode_t mode);

pathname:文件名稱;mode:創建權限

返回值:成功返回 0;失敗返回 -1

·總結:管道的本質:內核空間中的一塊緩沖區

原理:多個進程通過訪問同一塊緩沖區實現數據傳輸

分類:匿名管道、命名管道

匿名管道:只能用于具有親緣關系的進程間通信

命名管道:可以用于同一主機上任意進程間通信

特性:①半雙工通信 – 可以選擇方向的單向通信

提供字節流傳輸服務:有序的、可靠的、基于連接的一種流式傳輸

基于連接:所有讀端關閉則 write 異常;所有寫端關閉則 read 返回 0

②自帶同步與互斥:

同步:通過同一時間進程對臨界資源的唯一訪問實現訪問操作安全

互斥:通過一些條件判斷讓進程對臨界資源的訪問更加合理有序

互斥的體現:對管道進行寫入操作的大小不超過 PIPE_BUF-4096 大小,則保證操作的原子性

同步的體現:管道沒有數據則 read 阻塞,管道數據寫滿則 write 阻塞

③生命周期隨進程:不人為干預情況下,所有打開管道的進程退出后,管道緩沖區被釋放

·共享內存:用于實現進程間的數據共享

本質:一塊物理內存

原理:開辟一塊物理內存空間,多個進程將同一塊映射到自己的虛擬地址空間,通過虛擬地址直接進行訪問,進而實現數據共享

特性:最快的進程間通信方式,生命周期隨內核

        共享內存通過虛擬地址直接訪問物理內存,實現數據共享,相對于其他方式需要將數據拷貝到內核,使用時拷貝到用戶態,少了兩次數據拷貝操作

注意事項:對共享內存的操作需要注意安全問題

操作流程:

①創建或打開共享內存

②將共享內存映射到進程的虛擬地址空間

③通過映射的虛擬地址進行各種內存操作

④解除映射關系

⑤刪除共享內存

int shmget(key_t key, size_t size, int shmflg);

key:標識符(多個進程通過相同的標識符打開同一塊共享內存)

size:創建時所開辟的空間大小(以內存頁為單位)

shmflg:打開方式 + 創建權限 –IPC_CREAT|IPC_EXCL|0664

返回值:成功返回一個非負整數 – 操作句柄;失敗返回 -1

void *shmat(int shmid, const void *shmaddr, int shmflg);

shmid:shmget 返回的操作句柄

shmaddr:映射地址,通常設置為 NULL

shmflg:映射成功后的訪問方式;SHM_RDONLY- 只讀;0- 讀寫

返回值:成功則返回映射后的首地址;失敗返回 (void *)-1

int shmdt(const void *shmaddr);

shmaddr:映射后的首地址

返回值:成功返回 0;失敗返回 -1

int shmctl(int shmid, int cmd, struct shmid_ds *buf);

shmid:shmget 返回的操作句柄

cmd:操作類型 –IPC_RMID 標記共享內存為被銷毀

buf:對于 IPC_RMID,成功返回 0,失敗發返回 -1

·消息隊列

本質:內核中的一個優先級隊列,多個進程通過訪問同一個隊列,向隊列中添加或者獲取節點而實現進程間的數據塊傳輸

特性:自帶同步與互斥,生命周期隨內核

·信號量

本質:內核中的一個計數器 + pcb 等待隊列

作用:用于實現進程間的同步與互斥,協調進程對臨界資源的訪問

P 操作:計數器 -1,判斷若計數小于 0 則阻塞進程

V 操作:計數器 +1,喚醒一個阻塞的進程

通過自身的計數器對資源進行計數,通過計數判斷進程對資源的獲取是否合理,不合理則阻塞。等待產生一個資源之后,喚醒阻塞的進程

同步的實現:通過計數器對資源進行計數,在獲取資源之前進行 P 操作

互斥的實現:計數器為 1,表示資源只有一個,進程訪問資源之前進行 P 操作,訪問完畢后進行 V 操作

到此,相信大家對“Linux 進程間通信的方式是什么”有了更深的了解,不妨來實際操作一番吧!這里是丸趣 TV 網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-08-03發表,共計2421字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 乌拉特中旗| 台南市| 体育| 万源市| 永泰县| 郁南县| 长寿区| 廉江市| 舞阳县| 怀远县| 哈巴河县| 夏河县| 界首市| 巴楚县| 老河口市| 卢湾区| 遵化市| 龙山县| 金昌市| 凤阳县| 嘉兴市| 弥渡县| 板桥市| 宝山区| 通州市| 蕉岭县| 保山市| 北京市| 东台市| 青田县| 当阳市| 凤冈县| 南部县| 南澳县| 洮南市| 土默特右旗| 内黄县| 池州市| 红河县| 通海县| 白山市|