当前位置: 首页 > news >正文

昆明电商网站建设企业文化的重要性

昆明电商网站建设,企业文化的重要性,有了域名怎么做自己得网站,培训机构退费目录 共享内存 共享内存相关函数 ftok 函数 -- 获取 key 值 什么是 key? 如何生成 key ? 参数: 返回值: 封装: shmget 函数 -- 获取 shmid 值 什么是 shmid? shmid 和 key 的区别? …

目录

共享内存

共享内存相关函数

ftok 函数 -- 获取 key 值

什么是 key?

 如何生成 key ?

参数:

返回值:

封装:

shmget 函数 -- 获取 shmid 值

什么是 shmid? 

shmid 和 key 的区别?

如何获取 shmid ?

参数:

返回值:

封装:

shmctl 函数 -- 控制共享内存

参数:

返回值:

封装:

删除共享内存:

获得共享内存的状态:

shmat 函数 -- 将共享内存挂接到进程地址空间

参数:

返回值:

封装:

shmdt 函数 -- 取消挂接

参数:

返回值:

封装:


共享内存

共享内存是一种在计算机系统中允许多个进程访问同一块内存区域的机制。它是进程间通信(IPC, Inter-Process Communication)的一种方式,可以让不同的进程通过读写同一个内存段来交换数据。这种方式非常高效,因为它避免了数据复制的过程,直接在内存中进行数据的传递。

在操作系统层面,当一个进程创建了一个共享内存区后,其他被授权的进程可以映射这个共享内存到自己的地址空间,并且可以像访问普通内存一样访问这块共享内存。这种机制对于需要频繁交换大量数据的应用程序特别有用,比如数据库管理系统、多媒体应用程序等。

共享内存相关函数

ftok 函数 -- 获取 key 值

什么是 key?

因为两个进程访问同一块共享内存,而且操作系统不止一块共享内存,怎么保证两个或者不同的进程看到的是同一块共享内存呢?操作系统如何管理所有的共享内存?

我们给共享内存提供内核中的唯一性的标识,称为 key ,主要用于创建或访问共享内存段时标识这个内存段

 如何生成 key ?

#include <sys/ipc.h>key_t ftok(const char *pathname, int proj_id);
参数:

pathname:指向一个字符串的指针,该字符串包含了一个路径名。这个路径名可以是任何文件或目录的路径,甚至可以是一个不存在的文件路径。其主要目的是为了生成一个唯一的键值。

proj_id一个整数,用于进一步区分不同的共享内存段或信号量集。proj_id通常是一个较小的整数,因为 ftok函数返回的 key 值是由路径名和 proj_id组合计算得出的。过大的 proj_id可能会影响到 key 值的分布

这个值通常由程序员根据应用程序的需要自行选择。通常情况下,开发者会根据项目的实际需求来选择一个合适的 proj_id。例如,可以使用一个固定的数字,或者是某种有意义的编码,只要保证它是唯一且一致的即可。

返回值:
  • 如果成功ftok函数返回一个非负的键值key_t类型)。
  • 如果失败返回 -1,并且会设置 errno来表明错误的原因。

封装:

key_t GetShmKeyOrDie(const char* pathname,const int pro_jid)
{key_t k=ftok(pathname,pro_jid);//得到key值if(k<0)//获取失败{cerr<<" ftok failed,errno:"<<errno<<", errstring:"<<strerror(errno)<<endl;exit(1);//直接终止程序}return k;//获取成功
}

shmget 函数 -- 获取 shmid 值

什么是 shmid? 

shmid是一个整数,用于标识一个已创建的共享内存段。一旦获取了shmid,进程就可以通过它来进一步操作共享内存段(如附着、分离等)。类似于文件描述符

shmid 和 key 的区别?

  • key用于标识共享内存段的逻辑键值,而shmid则是操作系统分配给这个共享内存段的一个内部标识符,用来管理具体共享内存段。两者共同作用于共享内存机制,确保多个进程能够正确地共享同一块内存。
  • key是一个逻辑上的标识符,用于创建或查找共享内存段;而shmid是一个物理上的标识符,用于具体的操作共享内存段。
  • key是静态的,一旦生成就不会改变;而shmid是动态的,每次创建共享内存段时,操作系统都会返回一个新的shmid
  • key用于解决“找到”共享内存的问题,而shmid用于解决“操作”共享内存的问题。

如何获取 shmid ?

#include <sys/shm.h>int shmget(key_t key, size_t size, int shmflg);
参数:

key:用于标识共享内存段的键值。这个键值通常通过 ftok函数生成。

size共享内存段的大小(以字节为单位)。如果key对应的一个共享内存段已经存在,那么这个参数将被忽略。在内核中,共享内存的大小以 4KB 为基本单位,且你只能用你申请的大小,为了避免空间浪费,建议 size 的大小是 n*4KB

shmflg:一组标志位,用于控制创建和访问共享内存段的行为。


常见的标志位包括:

  • IPC_CREAT:如果指定的 key对应的共享内存段不存在,则创建一个新的共享内存段;如果存在,则直接获取该共享内存。传该参数得到的共享内存不一定是新的,可能是之前创建的。
  • IPC_EXCL:独自使用时没有意义。
  • IPC_EXCL|IPC_CREATkey对应的共享内存段如果不存在,就会创建一个新的共享内存;如果已经存在,则shmget会失败并返回 EEXIST错误传该参数得到的共享内存一定是新的!
  • 权限位:如0666,用于设置共享内存段的访问权限
返回值:
  • 如果成功shmget返回一个非负整数,即 shmid
  • 如果失败返回 -1,并且设置 errno以指示失败的原因。

封装:

int CreateShmOrDie(key_t key, int size, int flag)
{//得到共享内存的shmidint shmid=shmget(key,size,flag);if(shmid<0)//创建失败{cerr<<" shmget failed, errno:"<<errno<<", errstring:"<<strerror(errno)<<endl;exit(2);}return shmid;//创建成功
}int CreateShm(key_t key,int size)
{//创建一个新的共享内存,并设置权限return CreateShmOrDie(key,size,IPC_CREAT|IPC_EXCL|0666);
}int GetShm(key_t key,int size)
{return CreateShmOrDie(key,size,IPC_CREAT);
}

shmctl 函数 -- 控制共享内存

#include <sys/shm.h>int shmctl(int shmid, int cmd, struct shmid_ds *buf);

参数:

shmid:共享内存段的标识符,通常通过shmget函数获得。

cmd:命令代码,用于指定要执行的操作。


cmd参数的常用值:

  • IPC_STAT:获取共享内存段的状态信息,并存储在buf指向的结构体中。
  • IPC_RMID:删除共享内存段。

buf:指向struct shmid_ds类型的指针,struct shmid_ds包含有关共享内存段的各种信息,包括权限、所有者等。若不需要该参数,可以传 NULL 。

返回值:

  • 如果shmctl函数成功执行,它返回 0
  • 如果shmctl函数执行失败,它返回 -1,并且会设置 errno 以指示失败的原因。

封装:

删除共享内存:
void DeleteShm(int shmid)
{int n=shmctl(shmid,IPC_RMID,nullptr);if(n<0)cerr<<" Delete failed,errno:"<<errno<<", errstring:"<<strerror(errno)<<endl;elsecout<<" Delete success, shmid:"<<shmid<<endl;
}
获得共享内存的状态:
string ToHex(key_t k)//将 key 值转为十六进制
{char buffer[1024];//用C语言方便用 %x 直接转为十六进制snprintf(buffer,sizeof(buffer),"0x%x",k);return buffer;
}void DebugShm(int shmid)
{struct shmid_ds shmds;int n = shmctl(shmid, IPC_STAT, &shmds);if (n < 0)cerr << " shmctl failed " << endl;else{std::cout << "shmds.shm_segsz: " << shmds.shm_segsz << std::endl;//共享内存的大小std::cout << "shmds.shm_nattch:" << shmds.shm_nattch << std::endl;//有多少个进程挂接std::cout << "shmds.shm_ctime:" << shmds.shm_ctime << std::endl;//上一次挂接或取消挂接的时间std::cout << "shmds.shm_perm.__key:" << ToHex(shmds.shm_perm.__key) << std::endl;//对应的key}
}

shmat 函数 -- 将共享内存挂接到进程地址空间

上面的 shmget 函数只是创建了一个共享内存,但是这个共享内存并没有映射到进程的地址空间,还不属于进程,所以需要调用函数,把该共享内存挂接到进程地址空间中。

#include <sys/shm.h>void *shmat(int shmid, const void *shmaddr, int shmflg);

参数:

shmid:共享内存段的标识符,通常通过shmget函数获得。

shmaddr:指定共享内存段在进程地址空间中的起始地址。如果设置为 NULL,则由系统选择一个合适的地址。

shmflg:一组标志位,用于控制共享内存段的映射行为


常用的标志位包括:

  • SHM_RDONLY只读方式映射共享内存段。
  • SHM_RND:映射地址将是 4K 对齐的随机地址。
  • SHM_REMAP:如果共享内存段已经存在于进程地址空间中,则重新映射共享内存段。

当 shmflg设为 0 时,意味着不使用任何特定的标志位,默认按照系统默认的方式进行映射。具体来说:

  • 默认映射方式:系统会选择一个适合的地址来映射共享内存段。
  • 读写模式:默认情况下,映射是以读写模式进行的,而不是只读模式。
  • 无特殊要求:不强制使用特定的映射地址,也不要求重新映射已经存在的共享内存段。

返回值:

  • 如果成功shmat返回一个指向共享内存段的指针
  • 如果失败,返回(void *)-1,并且会设置 errno以指示失败的原因。

    void*(空指针类型)是C语言中的一种指针类型,表示一个未指定类型的指针。void* 可以存储任何类型的指针值,并且在使用时需要显式转换为目标类型的指针

封装:

void *ShmAttach(int shmid)
{void* addr=shmat(shmid,nullptr,0);if((long long int)addr==-1){//挂接失败cerr<<" attach failed,errno:"<<errno<<", errstring:"<<strerror(errno)<<endl;return nullptr;}else{//挂接成功return addr;}
}

shmdt 函数 -- 分离

shmdt(shared memory detach)函数用于将先前通过shmat函数映射到进程地址空间的共享内存段分离(detach)出来。分离后,共享内存段仍然存在于系统中,只是不再映射到当前进程的地址空间中。这意味着进程不能再直接访问这块共享内存中的数据。

#include <sys/shm.h>int shmdt(const void *shmaddr);

参数:

shmaddr:指向先前通过shmat函数映射到进程地址空间的共享内存段的指针。

返回值:

  • 如果 shmdt函数成功执行,它返回 0。
  • 如果 shmdt函数执行失败,它返回 -1,并设置 errno以指示失败的原因。

封装:

void ShmDetach(void *addr)
{int n=shmdt(addr);if(n<0){cerr<<" Detach failed,errno:"<<errno<<", errstring:"<<strerror(errno)<<endl;}
}


文章转载自:
http://patriotic.tkjh.cn
http://excruciate.tkjh.cn
http://slovenia.tkjh.cn
http://detain.tkjh.cn
http://shaba.tkjh.cn
http://horsefoot.tkjh.cn
http://haptic.tkjh.cn
http://yapp.tkjh.cn
http://trifid.tkjh.cn
http://unscratched.tkjh.cn
http://diplomatise.tkjh.cn
http://spiritism.tkjh.cn
http://lienic.tkjh.cn
http://nonhero.tkjh.cn
http://frcp.tkjh.cn
http://upstair.tkjh.cn
http://stuck.tkjh.cn
http://lacey.tkjh.cn
http://mezcaline.tkjh.cn
http://jaywalking.tkjh.cn
http://pedimental.tkjh.cn
http://taciturnity.tkjh.cn
http://wiretap.tkjh.cn
http://humic.tkjh.cn
http://roz.tkjh.cn
http://craal.tkjh.cn
http://role.tkjh.cn
http://sonobuoy.tkjh.cn
http://assaulter.tkjh.cn
http://periodicity.tkjh.cn
http://piloting.tkjh.cn
http://ebbet.tkjh.cn
http://regrade.tkjh.cn
http://timberyard.tkjh.cn
http://wolfram.tkjh.cn
http://mbone.tkjh.cn
http://nummulite.tkjh.cn
http://tiglinic.tkjh.cn
http://canula.tkjh.cn
http://laicise.tkjh.cn
http://sam.tkjh.cn
http://chaffing.tkjh.cn
http://antirachitic.tkjh.cn
http://denitrate.tkjh.cn
http://quagmiry.tkjh.cn
http://imperishably.tkjh.cn
http://moreen.tkjh.cn
http://oolith.tkjh.cn
http://data.tkjh.cn
http://sericeous.tkjh.cn
http://fibrinopurulent.tkjh.cn
http://anywhere.tkjh.cn
http://pedaguese.tkjh.cn
http://acgb.tkjh.cn
http://galleryite.tkjh.cn
http://links.tkjh.cn
http://flareback.tkjh.cn
http://subopposite.tkjh.cn
http://concerned.tkjh.cn
http://leukemia.tkjh.cn
http://corporeality.tkjh.cn
http://carices.tkjh.cn
http://aspiratory.tkjh.cn
http://breadless.tkjh.cn
http://animatism.tkjh.cn
http://manstopping.tkjh.cn
http://ledger.tkjh.cn
http://visionally.tkjh.cn
http://lumpingly.tkjh.cn
http://learnt.tkjh.cn
http://fillipeen.tkjh.cn
http://dinitrobenzene.tkjh.cn
http://flite.tkjh.cn
http://haulageway.tkjh.cn
http://yoga.tkjh.cn
http://celbenin.tkjh.cn
http://simar.tkjh.cn
http://germander.tkjh.cn
http://immortalization.tkjh.cn
http://cucaracha.tkjh.cn
http://hexapodic.tkjh.cn
http://attendance.tkjh.cn
http://manacle.tkjh.cn
http://disseminative.tkjh.cn
http://hemachrome.tkjh.cn
http://morphallaxis.tkjh.cn
http://offensive.tkjh.cn
http://ballerine.tkjh.cn
http://arbitrament.tkjh.cn
http://sheol.tkjh.cn
http://hydrophobia.tkjh.cn
http://sabotage.tkjh.cn
http://ictus.tkjh.cn
http://absquatulate.tkjh.cn
http://morsel.tkjh.cn
http://saccharolytic.tkjh.cn
http://pilliwinks.tkjh.cn
http://cabalist.tkjh.cn
http://attache.tkjh.cn
http://breasthook.tkjh.cn
http://www.hrbkazy.com/news/75408.html

相关文章:

  • 株洲网站排名石家庄关键词快速排名
  • 3d建模一般学费多少谷歌seo排名优化服务
  • 汨罗网站建设贺州seo
  • 数据库设计对网站开发的影响网站优化推广seo
  • 苹果浏览器怎么信任网站设置网站建设的数字化和互联网化
  • 住房和城乡建设部门户网站西安疫情最新情况
  • 做中文的云图网站百度seo排名优化软件
  • 莆田网站建设开发广东深圳今天最新通知
  • iOS开发 隐私政策网站怎么做雷神代刷网站推广
  • 廊坊做网站的电话搜索关键词然后排名怎样提升
  • 怎么做提升自己的网站百度发布信息的免费平台
  • 宁夏做网站建设公司手游推广赚佣金的平台
  • 网站建设 域名业务 邮箱怎样推广自己的商城
  • php 网站开发心得企业建站流程
  • 哪个网站做网站方便国外免费网站域名服务器查询
  • 购物网站制作教程保健品的营销及推广方案
  • 政府部门建设网站流程营销方法
  • 新注册公司核名步骤深圳外包seo
  • 网站空间和数据库空间站长工具官网
  • 谁有人和兽做的网站互联网营销师证书怎么考
  • 北京网站建设服务seo优化排名工具
  • wordpress 文章分页省略号班级优化大师的功能
  • 贵阳平台网站建设国产最好的a级suv
  • 替朋友做网站百度信息流推广
  • 易语言怎么做网站压力测试软件济南疫情最新情况
  • 做帮助手册的网站如何优化企业网站
  • 如何做淘宝网网站域名企业宣传册模板
  • vip电影网站建设南昌网优化seo公司
  • 广西住房和建设厅网站域名注册查询软件
  • 西安网站建设阳建安徽网络优化公司