- 進程間通信方式:管道、信號、消息隊列、共享內存、信號量、套接字
- 無名管道:a、只能用於具有親緣關係的進程之間;b、是半雙工的通信模式;c、可視爲特殊的文件,並不屬於任何文件系統,並且只存在於內核的內存空間
- 管道只能在具有親緣關係的進程間通信的原因:通過管道通信的基本原理本身就是子進程繼承父進程的管道文件描述符才得以和管道通信的,故只能在具有親緣關係的進程間通信。
- 管道的文件描述符爲fd[];其中fd[0]爲讀端、fd[1]爲寫端
- 只有在管道的讀端存在時,向管道寫入數據纔有效。
- 向管道寫數據時以阻塞的方式寫入
- 使用管道時父子進程需要通過同步與互斥機制保證運行先後順序
- 有名管道:突破了親緣進程間通信的限制;對有名管道的定位無法使用lseek();操作;對該管道的讀總是從開始處返回數據,對它們的寫則把數據添加到末尾。
- 創建有名管道需要使用mkfifo();操作是使用open();等文件操作函數
- 信號是在軟件層面對中斷機制的一種軟件模擬,是一種異步通信方式
- 信號可以直接在用戶空間進程和內核空間進程之間進行交互
- 信號的生命週期:信號產生、信號在進程中的註冊與註銷、執行信號處理函數
- 用戶進程對信號的處理方式:忽略信號(SIGKILL、SIGSTOP不可忽略)、捕捉信號、執行默認操作
- 發送信號的函數有kill();、raise();、alarm();、pause();
- SIGKILL :該信號用於立即停止一個進程,且不能夠被忽略、阻塞或處理
- SIGSTOP :該信號用於暫停一個進程,且不能夠被忽略、阻塞或處理
- waitpid();不僅可以用於回收子進程;還可以用於得到子進程得到的信號狀態
- signal();主要用於前32種非實時信號的處理。不支持信號傳遞信息。(推薦使用linux更健壯、更新的信號處理函數sigaction();)
- SIGKILL和SIGSTOP不能被catch和ignore
- signal();的作用:捕捉信號並作相應處理;
- 信號進入待處理狀態時進程並不清楚信號的存在,在信號集合退出阻塞集合時,未處理信號被進程作相應的處理
- 信號量的生命週期:創建信號量或獲得系統已存在的信號量(使用函數semget();)、初始化信號量(使用函數semctl();)、進行信號量的PV操作(使用semop();函數)、從系統中刪除信號量(semctl();的IPC_RMID)
- 進程間通信方式中最高效的方式爲:共享內存
- 共享內存的實現過程:a、創建共享內存(使用的函數爲shmget();目的是從內存中獲得一段共享的內存區)、b、映射共享內存(使用函數shmat();將具體的共享內存映射到相應的進程空間中)c、使用共享內存段;
- 消息隊列的使用步驟包括:a、創建或打開消息隊列;b、添加消息;c、讀取消息和控制消息隊列
- 消息隊列中的信息是存在於內核中的,又隊列ID來標識。 27.
單詞查詢:
- modifiable:可改變的
- describe : 描述
- via : 經過
- absolute value:絕對值
- immediately:馬上
- trace : 沿着
- provide:提供
- patch:修補
- delivery:傳遞
- integer : 整數
- inspect :檢查
- consist:由..組成
- demonstrate:示例
- pause:暫停
- monitor:監聽
- failure:失敗
- convert:轉換
- terminate:終止
- macro:宏
- disposition 處理
- associate :聯繫
- invocation:引用
- catch:捕捉
- initialize:初始化
- identity:一致
int atoi(const char *nptr);/*convert a string to integer*/
函數區別:
raise(); and pause();
raise();是進程給自身發一個signal(存在於signal.h)
pause();是用於將調用進程掛起直至捕捉到信號爲止;(存在於unistd.h)