首页 > 编程知识 正文

linux进程间通信方式最常用(进程间通信共享内存)

时间:2023-05-04 14:00:28 阅读:76982 作者:2958

8种机械键盘轴体的比较

本人,买写代码的键盘,红轴和茶轴怎么选?

系统v IPC机制下共享内存的本质是特殊内存区域,需要在进程之间共享的数据放在该共享内存区域,需要访问该共享区域的所有进程都必须将该共享区域映射到该进程的地址空间。 使用这种共享内存的进程可以向该区域写入信息,而使用另一个共享内存的进程通过简单的内存读取操作获取刚才写入的信息,在两个不同进程之间进行信息交换,实现进程之间的通信。

共享内存允许一个或多个进程通过同时存在于虚拟地址空间中的内存进行通信。 此虚拟内存中的页面由每个共享进程的页面表条目引用,并且所有进程的虚拟内存不必具有相同的地址。

进程对象对共享内存的访问由key (密钥)控制,同时key进行访问权限检查。

2 .共享内存的使用

Linux提供了一组函数接口,用于使用在头文件sys/shm.h中声明的共享内存。 显示共享内存显示ipcs #共享内存

与删除ipcrm -m shmid #共享内存相对应的函数是#include

#包含

#包含

key _ tft ok (常数char * pathname,int proj_id );

intshmget(key_tkey,int size,int shmflg );

void*shmat(intshmid,const void *shmaddr,int shmflg );

intshmdt(constvoid*shmaddr );

intshmctl(intshmid、int cmd、struct shmid_ds *buf );

2.1.ftok函数key _ tft ok (常数char * pathname,int proj_id );

函数ftok用于创建可以与共享内存段相关联的关键字。 参数pathname是完整路径的文件名,必须能够访问该文件。

参数proj_id通常传递非零字符

可以使用pathname和proj_id的组合创建唯一的密钥

如果调用成功,则返回关键字,否则返回-1

2.2.shmget函数intshmget(key_tkey,int size,int shmflg );

函数shmget用于创建或打开由函数的第一个参数唯一创建的共享内存段。 函数成功时,返回唯一的共享内存识别号(相当于进程号,唯一识别共享内存),失败时返回-1。 参数key是与共享存储器段相关联的关键字。 如果与指定关键字相关联的共享存储器段已经存在,则直接返回该存储器段的标识符,表示已打开;如果不存在,则创建新的共享存储器段。 key的值可以通过ftok函数生成,也可以用于创建IPC_PRIVATE (仅属于创建过程的共享内存,主要用于父子通信。 这意味着总是创建新的共享内存段。

参数size指定共享内存段的大小(以字节为单位)。

参数shmflg是掩码合成值,它是权限值和(IPC_CREAT或IPC_EXCL )的合成。 IPC_CREAT表示内存段不存在时创建。 IPC_EXCL表示如果此内存段存在,函数将返回失败结果(-1 )。 如果调用成功,则返回内存段id,否则返回-1

2.3.shmat函数void*shmat(intshmid,const void *shmaddr,int shmflg );

`

函数shmat将共享内存段映射到进程空间的地址。 参数shmid是共享内存段的标识符,通常必须是shmget的正常返回值

参数shmaddr指定共享内存连接到当前进程的地址的位置。 通常为NULL,表示让系统选择出现共享内存的地址。

参数shmflg是一组位标记,通常可以是0。

如果调用成功,则返回映射的进程区域的起始地址。 否则,返回(char * )-1。

2.4.shmdt函数intshmdt(constvoid*shmaddr );

函数shmdt用于将共享内存段与进程空间分离。 参数shmaddr通常是shmat的正常返回值。

函数正常返回0,失败时返回-1。

请注意,隔离共享内存并不删除,它只是当前进程中的共享内存不可用。

2.5.shmctl函数intshmctl(intshmid,int cmd,struct shmid_ds *buf );

函数shmctl是共享内存的控制函数,可用于删除共享内存段。 参数shmid是共享内存段标识符,通常必须是shmget的正常返回值

参数cmd是一种处理共享内存段的方法,可以选择IPC_STAT、IPC_SET或IPC_RMID。 通常为IPC_RMID,表示要删除共享内存段。

参数buf是表示共享内存段的信息结构数据,通常为NULL。

例如,shmctl(ksharemem、IPC_RMID、NULL )意味着删除调制共享存储器段kHareMem

三.实例

3.1 .有亲属关系的呼叫/

///@file 01_relation_share.cpp

//@ authoraveragejoewang ([电子邮件保护] ) )。

///

#包含

#包含

#包含

#包含

#包含

#包含

#包含

#包含

#包含

#包含

#包含

#define PERM S_IRUSR|S_IWUSR

using std:cout;

using std:endl;

//两个有亲属关系的进程进行通信

(intmain(intargc,char* argv[] ) ) ) ) ) ) ) ) ) ) )

{

intshmid=shmget(IPC_private,1024,PERM );

if(-1==shmid ) )。

{

fprintf(stderr,' createsharememoryerror : % SNA ',strerror(errno );

退出(1;

}

if(fork0)//父进程

{

char*p_addr=(char* ) shmat ) shmid,NULL,0 ); //获取该段的共享内存

memset(p_addr,'

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。