一、 shm_open)和shmget)区别
1.shm_open主要打开一个共享内存用户进程间交换大量数据。
用法:把共享内存以文件方式打开,这样就可以直接向文件中写入数据.
2.shmget:共享内存用于进程间通信。共享内存函数由shmget、shmat、shmdt、shmctl四个函数组成。
用法:<1>.获取到一个内存区,KEY相同情况下,各进程访问的是同一块内存。造型为指定类型后,直接操作访问。<2>.访问进程间要加锁。这个锁也必须是共享内存锁。写数据时,结构体中的缓冲区必须是已经声明足够大小,而不是一个指针需要时malloc。因为malloc的地址,其他进程访问不到。得到一个内存区, KEY相同情况下,各进程访问的是同一块内存。造型为指定类型后,直接操作访问。注意:<3>.访问进程间要加锁。这个锁也必须是共享内存锁。写数据时,结构体中的缓冲区必须是已经声明足够大小,而不是一个指针需要时malloc。因为malloc的地址,其他进程访问不到。 1.向共享内存写数据# emacs write_shm.c#include <stdio.h>#include <sys/shm.h>#include <unistd.h>#include <string.h>int mainint argc, char **argv) {int shmid;int i = 0;char *pshm;char buf[1024];//创建一块共享内存:1000:起始地址,size:10240shmid = shmget1000, 10240, 0666 | IPC_CREAT);ifshmid < 0 )fprintfstderr, “create share memory error\n”);//pshm指针指向内存区域0,0)pshm = char*)shmatshmid, 0, 0);ifpshm == NULL)fprintfstderr, “attach shm error\n”);printf”input node 0-9\n”);scanf”%d”, &i);printf”node is %d\n”, i);memsetbuf, 0, sizeofbuf));printf”input data\n”);scanf”%s”, buf);//向共享内存写buf数据memcpypshm + i*20, buf, 20);//指针解除绑定,进程结束系统会释放共享内存对物理地址得映射shmdtpshm);return 0;}
2.从共享内存中读数据 # emacs read_shm.c#include <stdio.h>#include <unistd.h>#include <string.h>#include <sys/shm.h>int mainint argc, char **argv) {int i;char *pshm;char buf[1024];int shmid;//创建一块共享内存:1000:起始地址,size:10240shmid = shmget1000, 10240, 0666 | IPC_CREAT);ifshmid < 0 )fprintfstderr, “create share memory error\n”);//pshm指针指向内存区域0,0) pshm = char*)shmatshmid, 0, 0); ifpshm == NULL)fprintfstderr, “attach shm error\n”);printf”input node 0-9\n”);scanf”%d”, &i);printf”node is %d\n”,i);memsetbuf, 0, 1024);//从共享内存中读数据bufmemcpybuf, pshm + i*20, 20);fprintfstderr,”data [%s]\n”,buf);//指针解除绑定,进程结束系统会释放共享内存对物理地址得映射shmdtpshm);return 0;}