#include <sys/mman.h>
void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset); 其中参数addr为描述符fd应该被映射到进程空间的起始地址,当指定为NULL时内核将自己去选择起始地址,无论addr是为NULL,函数返回值都是fd所映射到内存的起始地址; #include <sys/mman.h>
int munmap(void *addr, size_t length); 参数addr是由mmap返回的地址,len是映射区大小。 #include <sys/mman.h>
int msync(void *addr, size_t length, int flags);
参数addr和len代表内存区,flags有以下值指定,MS_ASYNC(执行异步写), MS_SYNC(执行同步写),MS_INVALIDATE(使高速缓存失效)。其中MS_ASYNC和MS_SYNC两个值必须且只能指定一个,一旦写操作排入内核,MS_ASYNC立即返回,MS_SYNC要等到写操作完成后才返回。如果还指定了MS_INVALIDATE,那么与其最终拷贝不一致的文件数据的所有内存中拷贝都失效。int sln_shm_get(char *shm_file, void **shm, int mem_len)
{
int fd;
fd = open(shm_file, O_RDWR | O_CREAT, 0644);//1. 创建内存段
if (fd < 0) {
printf("open <%s> failed: %s\n", shm_file, strerror(errno));
return -1;
}
ftruncate(fd, mem_len);//2.设置共享内存大小
*shm = mmap(NULL, mem_len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); //mmap映射系统内存池到进程内存
if (MAP_FAILED == *shm) {
printf("mmap: %s\n", strerror(errno));
return -1;
}
close(fd);
return 0;
}
int main(int argc, const char *argv[])
{
char *shm_buf = NULL;
sln_shm_get(SHM_IPC_FILENAME, (void **)&shm_buf, SHM_IPC_MAX_LEN);
snprintf(shm_buf, SHM_IPC_MAX_LEN, "hello share memory ipc! i'm server.");
return 0;
}client程序映射共享内存并读取其中数据:int main(int argc, const char *argv[])
{
char *shm_buf = NULL;
sln_shm_get(SHM_IPC_FILENAME, (void **)&shm_buf, SHM_IPC_MAX_LEN);
printf("ipc client get: %s\n", shm_buf);
munmap(shm_buf, SHM_IPC_MAX_LEN);
return 0;
}
先执行server程序向共享内存写入数据,再运行客户程序,运行结果如下:# ./server # ./client ipc client get: hello share memory ipc! i'm server. #共享内存不像socket那样本身具有同步机制,它需要通过增加其他同步操作来实现同步,比如信号量等。同步相关操作在后面会有相关专栏详细叙述。
本节源码下载:
http://download.csdn.net/detail/gentleliu/8140487
最后今天祝各位单身程序猿节日快乐!!!!!
原文地址:http://blog.csdn.net/shallnet/article/details/41006717