国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Linux > 正文

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

2024-08-27 23:54:59
字體:
來源:轉載
供稿:網友
  本篇內容主要講解“Linux進程間通信的方式是什么”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Linux進程間通信的方式是什么”吧!
 
  Linux進程間通信的方式是什么
 
  ·進程間通信:操作系統為系統提供的用于實現進程間通信的方式
 
  進程之間是無法直接通信的,因為每個進程都有獨立的虛擬地址空間,訪問的都是自己的虛擬地址,因此進程具有獨立性,無法直接通信
 
  根據通信場景的不同,因此提供了多種不同的通信方式
 
  進程間通信方式種類:管道、共享內存、消息隊列、信號量
 
  ·管道
 
  特性:半雙工通信--可以選擇方向的單向通信
 
  本質:在內核中開辟一塊緩沖區(內核空間中的一塊內存)
 
  原理:多個進程通過訪問同一塊內核中的緩沖區實現通信(復制緩沖區的操作句柄)
 
  分類:匿名管道:緩沖區沒有標識符,只能用于具有親緣關系的進程間通信
 
  命名管道:緩沖區具有標識符,可用于同一主機上任意的進程間通信
 
  linux下一切皆文件--所有東西都是當做文件一樣進行操作(包括管道),通過IO操作完成對管道的訪問
 
  ·匿名管道
 
  Linux進程間通信的方式是什么
 
  返回值:成功返回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操作。

(編輯:武林網)

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 金山区| 玉溪市| 雷山县| 普兰县| 调兵山市| 淮滨县| 临邑县| 台安县| 深水埗区| 上饶县| 横山县| 昌吉市| 随州市| 双城市| 呼玛县| 南昌市| 潮安县| 璧山县| 开平市| 马鞍山市| 启东市| 清河县| 冷水江市| 南丹县| 临猗县| 马龙县| 鸡泽县| 永修县| 浪卡子县| 来宾市| 安乡县| 海晏县| 太原市| 昌图县| 年辖:市辖区| 临沧市| 绥芬河市| 宣城市| 嘉峪关市| 武宁县| 望奎县|