共享内存使用方法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

共享内存---shmget shmat shmdt 要使用共享内存,应该有如下步骤:

1.开辟一块共享内存shmget()

2.允许本进程使用共某块共享内存shmat()

3.写入/读出

4.禁止本进程使用这块共享内存shmdt()

5.删除这块共享内存shmctl()或者命令行下ipcrm

ftok()。它有两个参数,一个是字符串,一个是字符。字符串一般用当前进程的程序名,字符一般用来标记这个标识符所标识的共享内存是这个进程所开辟的第几个共享内存。ftok()会返回一个key_t型的值,也就是计算出来的标识符的值。

shmkey = ftok( "mcut" , 'a' ); // 计算标识符

操作共享内存,我们用到了下面的函数

#include

#include

#include

int shmget( key_t shmkey , int shmsiz , int flag );

void *shmat( int shmid , char *shmaddr , int shmflag );

int shmdt( char *shmaddr );

shmget()是用来开辟/指向一块共享内存的函数。参数定义如下:key_t shmkey 是这块共享内存的标识符。如果是父子关系的进程间通信的话,这个标识符用IPC_PRIV A TE来代替。但是刚才我们的两个进程没有任何关系,所以就用ftok()算出来一个标识符使用了。

int shmsiz 是这块内存的大小.

int flag 是这块内存的模式(mode)以及权限标识。

模式可取如下值:新建:IPC_CREA T

使用已开辟的内存:IPC_ALLOC

如果标识符以存在,则返回错误值:IPC_EXCL

然后将“模式” 和“权限标识”进行“或”运算,做为第三个参数。

如:IPC_CREA T | IPC_EXCL | 0666

这个函数成功时返回共享内存的ID,失败时返回-1。

// shmid开辟共享内存

shmid = shmget( shmkey , sizeof(in_data) , IPC_CREA T | 0666 ) ;

shmat()是用来允许本进程访问一块共享内存的函数。

int shmid是那块共享内存的ID。

char *shmaddr是共享内存的起始地址

int shmflag是本进程对该内存的操作模式。如果是SHM_RDONL Y的话,就是只读模式。其它的是读写模式

成功时,这个函数返回共享内存的起始地址。失败时返回-1。

char *head , *pos ,

head = pos = shmat( shmid , 0 , 0 );

// 允许本进程使用这块共享内存

shmdt()与shmat()相反,是用来禁止本进程访问一块共享内存的函数。参数char *shmaddr是那块共享内存的起始地址。

成功时返回0。失败时返回-1。

shmdt( head ); // 禁止本进程使用这块内存

此外,还有一个用来控制共享内存的shmctl()函数如下:

#include

#include

#include

int shmctl( int shmid , int cmd , struct shmid_ds *buf );

int shmid是共享内存的ID。

int cmd是控制命令,可取值如下:

IPC_STA T 得到共享内存的状态

IPC_SET 改变共享内存的状态

IPC_RMID 删除共享内存

struct shmid_ds *buf是一个结构体指针。IPC_STA T的时候,取得的状态放在这个结构体中。如果要改变共享内存的状态,用这个结构体指定。

返回值:成功:0

失败:-1

shmctl(shmid,IPC_RMID,NULL);

struct shmid_ds buf;

... ...

shmctl( shmid , IPC_STA T , &buf ); // 取得共享内存的状态

... ...

shmctl( shmid , IPC_RMID , &buf ); // 删除共享内存

注意:在使用共享内存,结束程序退出后。如果你没在程序中用shmctl()

删除共享内存的话,一定要在命令行下用ipcrm命令删除这块共享内存。你要是不管的话,它就一直在那儿放着了。

简单解释一下ipcs命令和ipcrm命令。

取得ipc信息:

ipcs [-m|-q|-s]

-m 输出有关共享内存(shared memory)的信息

-q 输出有关信息队列(message queue)的信息

-s 输出有关“遮断器”(semaphore)的信息

%ipcs -m

删除ipc

ipcrm -m|-q|-s shm_id

%ipcrm -m 105

例如,我们在以0x12345678为KEY创建了一个共享内存,可以直接使用ipcrm -M 0x12345678来删除共享内存区域。

相关文档
最新文档