增加linux主机的共享内存,linux进程通讯之共享内存通讯

linux中共享内存进行通讯是常用的方式,通过共享一段内存进行交换数据。

常用到的函数有:shmget,shmat,shmdt.

shmget:int

shmget(key_t key,int size,int shmflg);用于创建一段共享内存。

当key取IPC_PRIVATE时,创建共享内存。

当key取0,shmflg取IPC_PRIVATE时,同样创建共享内存。

int shmflg

shmflg主要和一些标志有关。其中有效的包括IPC_CREAT和IPC_EXCL,它们的功能与open()的O_CREAT和O_EXCL相当。

IPC_CREAT 如果共享内存不存在,则创建一个共享内存,否则打开操作。 IPC_EXCL

只有在共享内存不存在的时候,新的共享内存才建立,否则就产生错误。

如果单独使用IPC_CREAT,shmget()函数要么返回一个已经存在的共享内存的操作符,要么返回一个新建的共享内存的标识符。如果将IPC_CREAT和IPC_EXCL标志一起使用,shmget()将返回一个新建的共享内存的标识符;如果该共享内存已存在,或者返回-1。IPC_EXEL标志本身并没有太大的意义,但是和IPC_CREAT标志一起使用可以用来保证所得的对象是新建的,而不是打开已有的对象。对于用户的读取和写入许可指定SHM_R和SHM_W,(SHM_R>3)和(SHM_W>3)是一组读取和写入许可,而(SHM_R>6)和(SHM_W>6)是全局读取和写入许可。

需要注意的是,使用参数要加上 | 0666

作为校验,在有些Linux系统中,如果不加此校验,则不能顺利获取共享空间的值(如Ubuntu)。此外,有两个常用参数,一般要同时出现,他们是:S_IRUSH

| S_IWUSR 。由于这两个参数非常常用,程序员一般做这样的操作

#define PERM S_IRUSR | S_IWUSR |

IPC_CREAT

其中,S_IRUSR

Permits the file's owner to read

it.

S_IWUSR

Permits the file's owner to write

to it.

S_IRGRP

Permits the file's group to read

it.

S_IWGRP

Permits the file's group to write

to it.

|是位或运算符。

可以通过命令来详细察看上述各个值的含义:man

creat。

这样一来,第三个参数就可以直接用PERM来表示了。

返回值:成功返回共享内存的标识符;不成功返回-1,errno储存错误原因。

需要包含的头文件:#include

#include

shmat:int shmat(int

shmid,char *shmaddr,int flag);将共享内存区对象映射到调用进程的地址空间。

shmdt:int shmdt(char

*shmaddr);函数与该共享内存块脱离。

需要包含的头文件:#include

#include

#include

范例:shmem.c

#include

#include

#include

#include

#include

#include

#include

#include

#include

void main(int argc,char

*argv[])

{

int memid;

char *c_mem,*r_mem;

if(argc<2)

{

printf("please input

something\n");

exit(1);

}

if((memid=shmget(IPC_PRIVATE,1024,S_IRUSR|S_IWUSR))==-1)

{

fprintf(stderr,"creat mem error

%s\n",strerror(errno));

exit(1);

}

if(fork())

{

c_mem=shmat(memid,0,0);

memset(c_mem,'\0',1024);

strcpy(c_mem,argv[1]);

wait(NULL);

exit(0);

}

else

{

sleep(1);

r_mem=shmat(memid,0,0);

printf("read is

%s\n",r_mem);

exit(0);

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值