Linux中處理序間通訊:共用記憶體 Linux給我們提供了豐富的內部進程通訊機制,包括共用記憶體、記憶體對應檔、先入先出(FIFO)、介面(sockets)以及多種用於同步的標識。 www.2cto.com 一般來說,內部進程通訊(interprocess communication)也就是IPC,是指兩個或兩個以上進程以及兩個或者兩個以上線程之間進行通訊聯絡。每個IPC機制都有不同的強項或者弱點, 不過沒有一個IPC機制包含內建的同步方法。因此程式員不但需要自己在程式中實現同步,而且還需要為了利用IPC機制而自己開發通訊協定。 共用記憶體----------------------------------------------------------- 使用共用記憶體和使用malloc()來分配記憶體地區很相似。使用共用記憶體的方法是: 1 對一個進程/線程使用shmget()分配記憶體地區。 2 使用shmat()放置一個或多個進程/線程在共用記憶體中,也可以用shmctl()來擷取資訊或者控制共用地區。 3 使用shmdt()從共用地區中分離。 4 使用shmctl()解除配置空間 共用記憶體是Linux中最快速的IPC方法。它也是一個雙向過程,共用地區內的任何進程都可以讀寫記憶體。這個機制的不利方面是其同步和協議都不受程式員控制,必須確保將控制代碼傳遞給了子進程和線程。 常式-----------------------------------------------------------#include <stdlib.h>#include <stdio.h>#include <string.h>#include <errno.h>#include <unistd.h>#include <sys/stat.h>#include <sys/types.h>#include <sys/ipc.h>#include <sys/shm.h>#define PERM S_IRUSR|S_IWUSR int main(int argc, char **argv){ key_t shmid; char *p_addr, *c_addr; pid_t pid; if(argc != 2) { fprintf(stderr, "Usage:%s/n/a", argv[0]); exit(1); } if( (shmid = shmget(IPC_PRIVATE, 1024, PERM)) == -1 ) { //(1) fprintf(stderr, "Create Share Memory Error:%s/n/a", strerror(errno)); exit(1); } pid = fork(); if(pid > 0) { p_addr = shmat(shmid, 0, 0); memset(p_addr, '/0', 1024); strncpy(p_addr, argv[1], 1024); wait(NULL); exit(0); } else if (pid == 0){ sleep(1); c_addr = shmat(shmid, 0, 0); printf("Client get %s/n", c_addr); exit(0); }} (1)IPC_PRIVATE 保證使用唯一IDS_IRUSR | S_IWUSR 使目前使用者可以讀寫這個地區 運行-----------------------------------------------------------$ ./a.out zengxiaolongClient get zengxiaolong$ ./a.out zengxiaolong 後記: 進程通訊(IPC)是網路程式的基礎,在很多的網路程式當中會大量的使用進程通訊的概念和知識.其實進程通訊是一件非常複雜的事情,我在這裡只是簡單的介紹了一下.如果你想學習進程通訊的詳細知識,最好的辦法是自己不斷的寫程式和看線上手冊.