Linux系统编程之共享内存

it2025-01-31  13

一、什么是共享内存 顾名思义,共享内存就是允许两个不相关的进程访问同一个逻辑内存。共享内存是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式。不同进程之间共享的内存通常安排为同一段物理内存。进程可以将同一段共享内存连接到它们自己的地址空间中,所有进程都可以访问共享内存中的地址,就好像它们是由用C语言函数malloc分配的内存一样。而如果某个进程向共享内存写入数据,所做的改动将立即影响到可以访问同一段共享内存的任何其他进程。 指令:ipcs -m 1、shmget函数 该函数用来创建共享内存,它的原型为: int shmget(key_t key, size_t size, int shmflg); key:键值 size:所需的共享内存大小,以字节为单位 shmflg:shmflg是权限标志,它的作用与open函数的mode参数一样,如果要想在key标识的共享内存不存在时,创建它的话,可以与IPC_CREAT做或操作。共享内存的权限标志与文件的读写权限一样 2、shmat函数 第一次创建完共享内存时,它还不能被任何进程访问,shmat函数的作用就是用来启动对该共享内存的访问,并把共享内存连接到当前进程的地址空间。它的原型如下: void *shmat(int shm_id, const void *shm_addr, int shmflg); shm_id:由shmget函数返回的共享内存标识。 shm_addr:定共享内存连接到当前进程中的地址位置,通常为空,表示让系统来选择共享内存的地址。 shmflg:一组标志位,通常为0 3、shmdt函数 该函数用于将共享内存从当前进程中分离。注意,将共享内存分离并不是删除它,只是使该共享内存对当前进程不再可用。它的原型如下: int shmdt(const void *shmaddr); 参数shmaddr是shmat函数返回的地址指针,调用成功时返回0,失败时返回-1. 4、shmctl函数 与信号量的semctl函数一样,用来控制共享内存,它的原型如下: int shmctl(int shm_id, int command, struct shmid_ds *buf); shm_id:shm_id是shmget函数返回的共享内存标识符。

command:command是要采取的操作,它可以取下面的三个值 : IPC_STAT:把shmid_ds结构中的数据设置为共享内存的当前关联值,即用共享内存的当前关联值覆盖shmid_ds的值。 IPC_SET:如果进程有足够的权限,就把共享内存的当前关联值设置为shmid_ds结构中给出的值 IPC_RMID:删除共享内存段

buf:是一个结构指针,它指向共享内存模式和访问权限的结构。 shmid_ds结构至少包括以下成员: struct shmid_ds { uid_t shm_perm.uid; uid_t shm_perm.gid; mode_t shm_perm.mode; }; shmw.c源代码

#include <stdio.h> #include <sys/ipc.h> #include <sys/shm.h> #include <stdlib.h> #include <sys/types.h> #include <string.h> #include <unistd.h> int main() { key_t key; key = ftok(".",1); char *shmaddr = NULL; int shmid = shmget(key,1024,IPC_CREAT|0666); if(shmid == -1){ printf("get shmid failuer\n"); exit(-1); } shmaddr = shmat(shmid,0,0); strcpy(shmaddr,"huangyuewen"); sleep(5); shmdt(shmaddr); shmctl(shmid,IPC_RMID,0); printf("quit\n"); return 0; }

shmr.c源代码

#include <stdio.h> #include <sys/ipc.h> #include <sys/shm.h> #include <stdlib.h> #include <sys/types.h> #include <string.h> int main() { key_t key; key = ftok(".",1); char *shmaddr = NULL; int shmid = shmget(key,1024,0); if(shmid == -1){ printf("get shmid failuer\n"); exit(-1); } shmaddr = shmat(shmid,0,0); printf("data:%s\n",shmaddr); shmdt(shmaddr); printf("quit\n"); return 0; }
最新回复(0)