转自:
http://zhuyunxiang.blog.51cto.com/653596/137221
http://www.bianceng.cn/Programming/C/201301/34882.htm
参数
|
描述
|
IPC_CREAT
|
创建共享内存,如果共享内存已经存在,就获取该共享内存的标识号。
|
IPC_EXCL
|
与宏IPC_CREAT一起使用,单独使用无意义,此时只能创建一个不存在的共享内存,如果内存已存在,则调用失败。
|
shmaddr
|
shmflg
|
映射地址
|
NULL
|
|
系统自动
|
非NULL
|
未置SHM_RND标志位
|
shmaddr
|
非NULL
|
置SHM_RND标志位
|
shmaddr - (shmaddr % SHMLBA)
|
以下两个程序是一个进程间通信的例子,没有做同步。这两个程序分别在不同的进程中运行,使用了共享内存进行通信。b从键盘读入数据,存放在共享内存中。a则从共享内存中读取数据,显示到屏幕上。由于没有使两个进程同步,显示的内容将是杂乱无章的,对这一问题的处理将在进一步学习有关同步的操作之后完成。
实例b程序负责向共享内存中写入数据,a程序负责从内存中读出共享的数据,它们之间并没有添加同步操作。
b.c
#include#include #include #include #define BUF_SIZE 1024 #define MYKEY 25 int main() { int shmid; char *shmptr; if((shmid = shmget(MYKEY,BUF_SIZE,IPC_CREAT)) ==-1) { printf("shmget error \n"); exit(1); } if((shmptr =shmat(shmid,0,0))==(void *)-1) { printf("shmat error!\n"); exit(1); } while(1) { printf("input:"); scanf("%s",shmptr); } exit(0); }
a.c
#include#include #include #include #define BUF_SIZE 1024 #define MYKEY 25 int main() { int shmid; char * shmptr; if((shmid = shmget(MYKEY,BUF_SIZE,IPC_CREAT)) ==-1) { printf("shmget error!\n"); exit(1); } if((shmptr = shmat(shmid,0,0)) == (void *)-1) { printf("shmat error!\n"); exit(1); } while(1) { printf("string :%s\n",shmptr); sleep(3); } exit(0); }