IPC(InterProcess Communication,進程間通訊)是進程中的重要概念。Linux 進程之間經常使用的通訊方式有:web
經過共享內存,兩個不相干的進程可使用同一段邏輯內存。這塊內存一般也是同一段物理內存。每一個進程都把這段共享內存鏈接到本身的地址空間中,直接訪問。socket
共享內存是進程間傳遞數據的經常使用方式,很是高效。svg
POSIX 共享內存區的使用包含四個步驟:函數
在編譯 POSIX 共享內存應用程序時須要加上 -lrt
參數。spa
shm_open() 函數用來打開或者建立一個共享內存區,兩個進程能夠經過給 shm_open() 函數傳遞相同的名字以達到操做同一共享內存的目的。操作系統
新建的共享內存區大小默認爲 0,須要使用 ftruncate 函數設置大小才能使用。code
函數原型:xml
#include <sys/mman.h> #include <sys/stat.h> #include <fcntl.h> int shm_open(const char *name, int oflag, mode_t mode);
返回值:
成功返回建立或打開的共享內存描述符(與文件描述符相同做用),失敗返回-1。對象
參數:token
新建的共享內存默認大小爲 0,須要設置共享內存大小。ftruncate()函數可用來調整文件或者共享內存的大小。
函數原型:
#include <unistd.h> #include <sys/types.h> int ftruncate(int fd, off_t length);
函數成功返回 0,失敗返回-1。
參數:
共享內存建立或打開後,是不能在進程內直接使用的。須要先映射到當前進程的地址空間。
函數原型:
#include <sys/mman.h> void *mmap(void *addr, size_t length, int prot, int flags,int fd, off_t offset);
參數:
函數原型:
#include <sys/mman.h> int munmap(void *addr, size_t length);
函數成功返回 0,不然返回-1;
參數:
函數原型:
#include <sys/mman.h> #include <sys/stat.h> #include <fcntl.h> int shm_unlink(const char *name);
函數成功返回 0,不然返回-1。
兩個沒有血緣關係的進程,也可使用共享內存進行進程間通訊: