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);
}
}