Chinaunix首页 | 论坛 | 博客
  • 博客访问: 218493
  • 博文数量: 71
  • 博客积分: 1420
  • 博客等级: 上尉
  • 技术积分: 952
  • 用 户 组: 普通用户
  • 注册时间: 2008-01-11 14:26
文章存档

2009年(16)

2008年(55)

我的朋友

分类: LINUX

2008-04-16 09:42:38

三、posix共享内存函数

posix共享内存区涉及两个步骤:

1、指定一个名字参数调用shm_open,以创建一个新的共享内存区对象或打开一个以存在的共享内存区对象。

2、调用mmap把这个共享内存区映射到调用进程的地址空间。传递给shm_open的名字参数随后由希望共享该内存区的任何其他进程使用。

 

5

名称:

shm_open

功能

打开或创建一个共享内存区

头文件

#include

函数原形

int shm_open(const char *name,int oflag,mode_t mode);

参数

name    共享内存区的名字

cflag    标志位

mode    权限位

返回值:

成功返回0,出错返回-1

      

 

 

 

 

 oflag参数必须含有O_RDONLYO_RDWR标志,还可以指定如下标志:O_CREAT,O_EXCLO_TRUNC.

       mode参数指定权限位,它指定O_CREAT标志的前提下使用。

shm_open的返回值是一个整数描述字,它随后用作mmap的第五个参数。

 

6

名称:

shm_unlink

功能

删除一个共享内存区

头文件

#include

函数原形

int shm_unlink(const char *name);

参数

name    共享内存区的名字

返回值:

成功返回0,出错返回-1

      

 

 

 shm_unlink函数删除一个共享内存区对象的名字,删除一个名字仅仅防止后续的open,mq_opensem_open调用取得成功。

 

下面是创建一个共享内存区的例子:

/*shm_open.c创建共享内存区*/

#include

#include

#include

 

int main(int argc,char **argv)

{

int shm_id;

 

if(argc!=2)

{

    printf(“usage:shm_open \n”);

    exit(1);

}

shm_id=shm_open(argv[1],O_RDWR|O_CREAT,0644);

printf(“shmid:%d\n”,shm_id);

shm_unlink(argv[1]);

}

       下面是运行结果,注意编译程序我们要加上“-lrt”参数。

#cc –lrt –o shm_open shm_open.c

#./shm_open test

shm_id:3

 

 

四、ftruncatefstat函数

普通文件或共享内存区对象的大小都可以通过调用ftruncate修改。

7

名称:

ftruncate

功能

调整文件或共享内存区大小

头文件

#include

函数原形

int ftruncate(int fd,off_t length);

参数

fd          描述符

length       大小

返回值:

成功返回0,出错返回-1

 

 

 

 

 

 

 

 

 

 

当打开一个已存在的共享内存区对象时,我们可调用fstat来获取有关该对象的信息。

 

8

名称:

fstat

功能

获得文件或共享内存区的信息

头文件

#include

#include

#include

函数原形

int stat(const char *file_name,struct stat *buf);

参数

file_name          文件名

buf               stat结构

返回值:

成功返回0,出错返回-1

     

 

 

 

 

 

 

  对于普通文件stat结构可以获得12个以上的成员信息,然而当fd指代一个共享内存区对象时,只有四个成员含有信息。

struct stat{

mode_t st_mode;

uid_t st_uid;

gid_t st_gid;

off_t st_size;

};

 

/*shm_show.c显示共享区信息*/

#include

#include

#include

#include

#include

#include

 

int main(int argc,char **argv)

{
    int shm_id;

struct stat buf;

 

if(argc!=2)

{

    printf(“usage:shm_open \n”);

    exit(1);

}

shm_id=shm_open(argv[1],O_RDWR|O_CREAT,0644);/*创建共享内存*/

ftruncate(shm_id,100);/*修改共享内存的打开*/

fstat(shm_id,&buf); /*把共享内存的信息记录到buf*/

printf(“uid_t:%d\n”,buf.st_uid); /*共享内存区所有者ID*/

printf(“git_t:%d\n”,buf.st_gid); /*共享内存区所有者组ID*/

printf(“size :%d\n”,buf.st_size); /*共享内存区大小*/

}

下面是运行结果:

#cc –lrt –o shm_show shm_show.c

#./shm_show test

uid_t:0

git_t:0

size:100

阅读(779) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~