linux ipc机制-共享内存

17.shmat()
功能:联接共享内存的操作.
语法:
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/msg.h>

void *shmat(shmid,shmaddr,shmflg)
int shmid;
void *shmaddr;
int shmid;
说明:将由shmid指示的共享内存联接到调用进程的数据段中.被联接的段放在地址,该地址由以下准则指定:
. 若shmaddr等于(void *)0,则段联接到由系统选择的第一个可用的地址上.
. 若shmaddr不等于(void *)0同时(shmflg&SHM_RND)值为真,则段联接到由(shmaddr-(shmaddr SHMLBA))给出的地址上.
. 若shmaddr不等于(void *)0同时(shmflg&SHM_RND)值为假,则段联接到由shmaddr指定的地址上.
若(shmflg&sSHM_RDONLY)为真并且调用进程有读允许,则被联接的段为只读;否则,若值不为真且调用进程有读写权限,则被联接的段为可读写的.
返回值:若调用成功则返回被联接的共享内存段在数据段上的启始地址.否则返回值为-1.

20.shmctl()
功能:共享内存控制操作.
语法:
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/msg.h>

int shmctl(shmid,cmd,buf)
int shmid,cmd;
struct shmid_ds *buf;
说明:本系统调用提供一系列共享内存控制操作.操作行为由cmd指定.
以下为cmd的有效值:
. IPC_STAT:将shmid相关的数据结构中各个元素的当前值放入由buf指向的结构中.
. IPC_SET:将shmid相关的数据结构中的下列元素设置为由buf指向的结构中的对应值.
shm_perm.uid
shm_perm.gid
shm_perm.mode
本命令只能由有效UID等于shm_perm.cuid或shm_perm.uid的进程或有效UID有合适权限的进程操作.
. IPC_RMID:删除由shmid指示的共享内存.将它从系统中删除并破坏相关的数据结构.
本命令只能由有效UID等于shm_perm.cuid或shm_perm.uid的进程或有效UID有合适权限的进程操作.
返回值:若调用成功则返回0,否则返回-1.

18.shmdt()
功能:断开共享内存联接的操作.
语法:
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/msg.h>

void *shmdt(shmaddr)
void *shmaddr;
说明:本系统调用将由shmaddr指定的共享内存段从调用进程的数据段脱离出去.
返回值:若调用成功则返回值为0,否则返回值为-1.

19.shmget()
功能:取得共享内存段
语法:
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/msg.h>

int shmget(key,size,shmflg)
key_t key;
int size,shmflg;
说明:本系统调用返回key相关的共享内存标识符.共享内存标识符和相关数据结构及至少size字节的共享内存段能正常创建,要求以下事实成立:
. 参数key等于IPC_PRIVATE.
. 参数key没有相关的共享内存标识符,同时(shmflg&IPC_CREAT)值为真.
共享内存创建时,新生成的共享内存标识相关的数据结构被初始化如下:
. shm_perm.cuid和shm_perm.uid设置为调用进程的有效UID.
. shm_perm.cgid和shm_perm.gid设置为调用进程的有效GID.
. shm_perm.mode访问权限比特位设置为shmflg访问权限比特位.
. shm_lpid,shm_nattch,shm_atime,shm_dtime设置为0.
. shm_ctime设置为当前系统时间.
. shm_segsz设置为0.
返回值:若调用成功则返回一个非0值,称为共享内存标识符,否则返回值为-1.

例子:本例包括上述所有共享内存操作系统调用:
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/msg.h>

#include <stdio.h>

#define SHMKEY 74
#define K 1024
int shmid;
cleanup()
{
shmctl(shmid,IPC_RMID,0);
exit(0);
}
main()
{
int *pint;
char *addr1,*addr2;
extern char *shmat();
extern cleanup();
for (i=0;i<20;i++)
signal(i,cleanup);
shmid=shmget(SHMKEY,128*K,0777|IPC_CREAT);
addr1=shmat(shmid,0,0);
addr2=shmat(shmid,0,0);
printf("addr1 0x x addr2 0x x/n",addr1,addr2);
pint=(int*)addr1;
for (i=0;i<256;i++)
*pint++=i;
pint=(int*)addr1;
*pint=256;
pint=(int*)addr2;
for (i=0;i<256;i++)
printf("index d/tvalue d/n",i,*pint++);
shmdt(addr1);
shmdt(addr2);
pause();
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值