Linux中國

免費電子書《Linux 進程間通信指南》介紹

讓一個軟體過程與另一個軟體過程進行對話是一個微妙的平衡行為。但是,它對於應用程序而言可能是至關重要的功能,因此這是任何從事複雜項目的程序員都必須解決的問題。你的應用程序是否需要啟動由其它軟體處理的工作;監視外設或網路上正在執行的操作;或者檢測來自其它來源的信號,當你的軟體需要依賴其自身代碼之外的東西來知道下一步做什麼或什麼時候做時,你就需要考慮 進程間通信 inter-process communication IPC)。

這在 Unix 操作系統上已經由來已久了,這可能是因為人們早期預期軟體會來自各種來源。按照相同的傳統,Linux 提供了一些同樣的 IPC 介面和一些新介面。Linux 內核具有多種 IPC 方法,util-linux 包包含了 ipcmkipcrmipcslsipc 命令,用於監視和管理 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

本文由 LCTT 原創編譯,Linux中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的電子郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國