赞
踩
函数原型:
int shmget(key_t key, size_t size, int shmflg);
参数:
key:进程间通信的键值,ftok的返回值
size:共享内存的大小(以对齐1024)
shmflg:标识函数的行为及共享内存的权限。取值如下:
IPC_CREAT:如果不存在就创建共享内存(0666可读可写)
IPC_EXCL:和IPC_CREAT搭配使用,如果已经存在,则返回失败
权限位:设置共享内存的访问权限
返回值:成功返回一个非负整数(id),即共享内存的标识符;失败返回-1
————————————————
注意:exit 出现异常exit(-1) ,正常退出exit(0)
函数原型:
void *shmat(int shmid, const void *shmaddr, int shmflg);
参数:
shmid:共享内存标识符,shmget的返回值
shmaddr:指定映射地址(若为NULL,则由系统自动指定)
shmflg:共享内存的访问权限和映射条件(通常为0),取值如下:
0:共享内存具有可读可写权限
SHM_RDONLY:映射的内存只读
返回值: 成功返回一个指针,指向共享内存第一个节;失败返回-1
————————————————
函数原型:
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
参数:
shmid:由shmget返回的共享内存的标识码
cmd:将要采取的动作,有如下取值:
IPC_RMID:删除共享内存
IPC_SET:在进程有足够权限的前提下,把共享内存的当前关联值设置为shmid_ds数据结构中给出的值
IPC_STAT:把shmid_ds结构中的数据设置为共享内存的当前关联值
SHM_LOCK:锁定共享内存段(超级用户)
SHM_UNLOCK:解锁共享内存段
buf:指向一个保存着共享内存的模式状态和访问权限的数据结构(不关心 0)
返回值:成功返回0;失败返回-1
————————————————
需要两个程序进程 都是相同的操作
一般A创建之后,B就不需要创建,将创建的地方设为0,A为写的话,B就读
A
- int main(){
-
- key_t key;
- key=ftok(".",'1');
- int id=shmget(key,1024*3,IPC_CREAT|0666);
- if(id==-1){
- printf("creat space error\n");
- exit(-1);
- }
- char *buf=shmat(id,NULL,0);
- strcpy(buf ,"pengyuandanhenhard"); //write
- sleep(7);
- shmdt(buf);
- shmctl(id,IPC_RMID,0);
B
- int main(){
-
- key_t key;
- key=ftok(".",'1');
-
- int id=shmget(key,1024*3,0);
- if(id==-1){
- printf("creat space error\n");
- exit(-1);
- }
- char *buf=shmat(id,NULL,0);
- // strcpy(buf ,"pengyuandanhenhard"); //write
- // sleep(7);
- printf("get data is :%s",buf);
- shmdt(buf);
- shmctl(id,IPC_RMID,0);
先运行a然后b
补充:怎么查看操作系统中有哪些共享内存
ipcs -m
如何把共享内存删掉
ipcs -m id号
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。