三、posix共享内存函数
posix共享内存区涉及两个步骤:
1、指定一个名字参数调用shm_open,以创建一个新的共享内存区对象或打开一个以存在的共享内存区对象。
2、调用mmap把这个共享内存区映射到调用进程的地址空间。传递给shm_open的名字参数随后由希望共享该内存区的任何其他进程使用。
5.
名称::
|
shm_open
|
功能:
|
打开或创建一个共享内存区
|
头文件:
|
#include <sys/mman.h>
|
函数原形:
|
int shm_open(const char *name,int oflag,mode_t mode);
|
参数:
|
name 共享内存区的名字
cflag 标志位
mode 权限位
|
返回值:
|
成功返回0,出错返回-1
|
oflag参数必须含有O_RDONLY和O_RDWR标志,还可以指定如下标志:O_CREAT,O_EXCL或O_TRUNC.
mode参数指定权限位,它指定O_CREAT标志的前提下使用。
shm_open的返回值是一个整数描述字,它随后用作mmap的第五个参数。
6.
名称::
|
shm_unlink
|
功能:
|
删除一个共享内存区
|
头文件:
|
#include <sys/mman.h>
|
函数原形:
|
int shm_unlink(const char *name);
|
参数:
|
name 共享内存区的名字
|
返回值:
|
成功返回0,出错返回-1
|
shm_unlink函数删除一个共享内存区对象的名字,删除一个名字仅仅防止后续的open,mq_open或sem_open调用取得成功。
下面是创建一个共享内存区的例子:
/*shm_open.c创建共享内存区*/
#include <sys/mman.h>
#include <stdio.h>
#include <fcntl.h>
int main(int argc,char **argv)
{
int shm_id;
if(argc!=2)
{
printf(“usage:shm_open <pathname>/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
四、ftruncate和fstat函数
普通文件或共享内存区对象的大小都可以通过调用ftruncate修改。
7.
名称::
|
ftruncate
|
功能:
|
调整文件或共享内存区大小
|
头文件:
|
#include <unistd.h>
|
函数原形:
|
int ftruncate(int fd,off_t length);
|
参数:
|
fd 描述符
length 大小
|
返回值:
|
成功返回0,出错返回-1
|
当打开一个已存在的共享内存区对象时,我们可调用fstat来获取有关该对象的信息。
8.
名称::
|
fstat
|
功能:
|
获得文件或共享内存区的信息
|
头文件:
|
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
|
函数原形:
|
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 <unistd.h>
#include <sys/type.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <sys/mman.h>
int main(int argc,char **argv)
{ int shm_id;
struct stat buf;
if(argc!=2)
{
printf(“usage:shm_open <pathname>/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
分享到:
相关推荐
Posix多线程编程学习笔记,重点介绍线程、信号灯、互斥量和共享内存。
Posix多线程编程学习笔记1~6,包括线程基础,线程属性,信号灯,条件变量,互斥变量,共享内存六部分内容。很有助于linux下多线程的开发。文档主要包含介绍相应的pthread接口函数,并举了部分相应的例子。
Posix多线程编程
Posix多线程编程—线程属性.doc Posix多线程编程—线程属性.doc Posix多线程编程—线程属性.doc Posix多线程编程—线程属性.doc
POSIX多线程编程入门 英文版 POSIX多线程编程入门 英文版
Posix多线程编程[总结].pdf
posix多线程程序设计源码 posix多线程程序设计源码 posix多线程程序设计源码 posix多线程程序设计源码
POSIX多线程编程指南,帮助你进行POSIX多线程编程,可以做为LINUX开发人员的参考。
posix多线程编程, 入门例子, 代码例子已经调试过
POSIX多线程程序设计,讲述在Linux平台下使用POSIX进行多线程编程的教程。
POSIX多线程程序设计随书源码,很不错的多线程编程资料
posix多线程编程经典
多线程编程的经典好书
Posix_线程编程指南,包括线程创建,取消,私有数据,同步,终止等方面
基于posix多线程编程指南
linux下pthread的多线程编程+代码,适合初学者
Posix多线程编程.pdf