免費電子書《Linux 進程間通信指南》介紹
讓一個軟體過程與另一個軟體過程進行對話是一個微妙的平衡行為。但是,它對於應用程序而言可能是至關重要的功能,因此這是任何從事複雜項目的程序員都必須解決的問題。你的應用程序是否需要啟動由其它軟體處理的工作;監視外設或網路上正在執行的操作;或者檢測來自其它來源的信號,當你的軟體需要依賴其自身代碼之外的東西來知道下一步做什麼或什麼時候做時,你就需要考慮 進程間通信 (IPC)。
這在 Unix 操作系統上已經由來已久了,這可能是因為人們早期預期軟體會來自各種來源。按照相同的傳統,Linux 提供了一些同樣的 IPC 介面和一些新介面。Linux 內核具有多種 IPC 方法,util-linux 包包含了 ipcmk
、ipcrm
、ipcs
和 lsipc
命令,用於監視和管理 IPC 消息。
顯示進程間通信信息
在嘗試 IPC 之前,你應該知道系統上已經有哪些 IPC 設施。lsipc
命令提供了該信息。
RESOURCE DESCRIPTION LIMIT USED USE%
MSGMNI Number of message queues 32000 0 0.00%
MSGMAX Max size of message (byt.. 8192 - -
MSGMNB Default max size of queue 16384 - -
SHMMNI Shared memory segments 4096 79 1.93%
SHMALL Shared memory pages 184[...] 25452 0.00%
SHMMAX Max size of shared memory 18446744073692774399
SHMMIN Min size of shared memory 1 - -
SEMMNI Number of semaphore ident 32000 0 0.00%
SEMMNS Total number of semaphore 1024000.. 0 0.00%
SEMMSL Max semaphores per semap 32000 - -
SEMOPM Max number of operations p 500 - -
SEMVMX Semaphore max value 32767 - -
你可能注意到,這個示例清單包含三種不同類型的 IPC 機制,每種機制在 Linux 內核中都是可用的:消息(MSG)、共享內存(SHM)和信號量(SEM)。你可以用 ipcs
命令查看每個子系統的當前活動:
$ ipcs
------ Message Queues Creators/Owners msqid perms cuid cgid [...]
------ Shared Memory Segment Creators/Owners
shmid perms cuid cgid [...]
557056 700 seth users [...]
3571713 700 seth users [...]
2654210 600 seth users [...]
2457603 700 seth users [...]
------ Semaphore Arrays Creators/Owners semid perms cuid cgid [...]
這表明當前沒有消息或信號量陣列,但是使用了一些共享內存段。
你可以在系統上執行一個簡單的示例,這樣就可以看到正在工作的系統之一。它涉及到一些 C 代碼,所以你必須在系統上有構建工具。必須安裝這些軟體包才能從源代碼構建軟體,這些軟體包的名稱取決於發行版,因此請參考文檔以獲取詳細信息。例如,在基於 Debian 的發行版上,你可以在 wiki 的構建教程部分了解構建需求,而在基於 Fedora 的發行版上,你可以參考該文檔的從源代碼安裝軟體部分。
創建一個消息隊列
你的系統已經有一個默認的消息隊列,但是你可以使用 ipcmk
命令創建你自己的消息隊列:
$ ipcmk --queue
Message queue id: 32764
編寫一個簡單的 IPC 消息發送器,為了簡單,在隊列 ID 中硬編碼:
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdio.h>
#include <string.h>
struct msgbuffer {
char text[24];
} message;
int main() {
int msqid = 32764;
strcpy(message.text,"opensource.com");
msgsnd(msqid, &message, sizeof(message), 0);
printf("Message: %sn",message.text);
printf("Queue: %dn",msqid);
return 0;
}
編譯該應用程序並運行:
$ gcc msgsend.c -o msg.bin
$ ./msg.bin
Message: opensource.com
Queue: 32769
你剛剛向你的消息隊列發送了一條消息。你可以使用 ipcs
命令驗證這一點,可以使用 ——queue
選項將輸出限制到該消息隊列:
$ ipcs -q
------ Message Queues -----key msqid owner perms used-bytes messages
0x7b341ab9 0 seth 666 0 0
0x72bd8410 32764 seth 644 24 1
你也可以檢索這些消息:
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdio.h>
struct msgbuffer {
char text[24];
} message;
int main() {
int msqid = 32764;
msgrcv(msqid, &message, sizeof(message),0,0);
printf("nQueue: %dn",msqid);
printf("Got this message: %sn", message.text);
msgctl(msqid,IPC_RMID,NULL);
return 0;
編譯並運行:
$ gcc get.c -o get.bin
$ ./get.bin
Queue: 32764
Got this message: opensource.com
下載這本電子書
這只是 Marty Kalin 的《Linux 進程間通信指南》中課程的一個例子,可從 Opensource.com 下載的這本最新免費(且 CC 授權)的電子書。在短短的幾節課中,你將從消息隊列、共享內存和信號量、套接字、信號等中了解 IPC 的 POSIX 方法。認真閱讀 Marty 的書,你將成為一個博識的程序員。而這不僅適用於經驗豐富的編碼人員,如果你編寫的只是 shell 腳本,那麼你將擁有有關管道(命名和未命名)和共享文件的大量實踐知識,以及使用共享文件或外部消息隊列時需要了解的重要概念。
如果你對製作具有動態和具有系統感知的優秀軟體感興趣,那麼你需要了解 IPC。讓這本書做你的嚮導。
via: https://opensource.com/article/20/1/inter-process-communication-linux
作者:Seth Kenlon 選題:lujun9972 譯者:laingke 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive