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。
两个没有血缘关系的进程,也可使用共享内存进行进程间通讯: