加入收藏 | 设为首页 | 会员中心 | 我要投稿 瑞安网 (https://www.ruian888.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

System V IPC 之共享内存

发布时间:2021-02-18 09:48:58 所属栏目:Linux 来源:网络整理
导读:进程间通信(Interprocess Communication) 的缩写,通常指允许用户态进程执行系列操作的一组机制: 信号量 、 消息队列 和 三种。IPC 的数据结构是在进程请求 IPC 资源时动态创建的。每个 IPC 资源都是持久的:除非被进程显式地释放,否则永远驻留在内存中(直

进程间通信(Interprocess Communication)的缩写,通常指允许用户态进程执行系列操作的一组机制:

信号量、消息队列和三种。IPC 的数据结构是在进程请求 IPC 资源时动态创建的。每个 IPC 资源都是持久的:除非被进程显式地释放,否则永远驻留在内存中(直到系统关闭)。IPC 资源可以由任一进程使用,包括那些不共享祖先进程所创建的资源的进程。

共享内存是进程间通信的一种最基本、最快速的机制。共享内存是两个或多个进程共享同一块内存区域,并通过该内存区域实现数据交换的进程间通信机制。通常是由一个进程开辟一块共享内存区域,然后允许多个进程对此区域进行访问。由于不需要使用中间介质,而是数据由内存直接映射到进程空间,因此共享内存是最快速的进程间通信机制。

uid:所有者的有效用户 ID。gid:所有者的有效组 ID。cuid:创建者的有效用户 ID。cgid:创建者的有效组 ID。mode:表示此对象的访问权限。seq:对象的应用序号。key:对象的键。

shm_perm:对应于该共享内存的 ipc_perm 结构。shm_segsz:以字节表示的共享内存区域的大小。shm_lpid:最近一次调用 shmop 函数的进程 ID。shm_cpid:创建该共享内存的进程 ID。shm_nattch:当前使用该共享内存区域的进程数。shm_atime:最近一次附加操作的时间。shm_dtime:最近一次分离操作的时间。shm_ctime:最近一次改变的时间。

#include

<span style="color: #0000ff">int shmget(key_t key,size_t size,<span style="color: #0000ff">int flg);

#include

<span style="color: #0000ff">void shmat(<span style="color: #0000ff">int shmid,<span style="color: #0000ff">const <span style="color: #0000ff">void shmaddr,<span style="color: #0000ff">int flag);

#include

<span style="color: #0000ff">int shmdt(<span style="color: #0000ff">const <span style="color: #0000ff">void *shmaddr);

#include

<span style="color: #0000ff">int shmctl(<span style="color: #0000ff">int shmid,<span style="color: #0000ff">int cmd,<span style="color: #0000ff">struct shmid_ds *buf);

SHM_LOCK:将共享内存区域上锁。IPC_RMID:用于删除共享内存。IPC_SET:按参数 buf 指向的结构中的值设置该共享内存对应的 shmid_ds 结构。IPC_STAT:用于取得该共享内存区域的 shmid_ds 结构,保存到 buf 指向的缓冲区。SHM_UNLOCK:将上锁的共享内存区域释放。

#include

<span style="color: #0000ff">#define BUF_SIZE 1024
<span style="color: #0000ff">#define MYKEY 24

<span style="color: #0000ff">int main(<span style="color: #0000ff">void<span style="color: #000000">)
{
<span style="color: #0000ff">int<span style="color: #000000"> shmid;
<span style="color: #0000ff">char <span style="color: #000000">shmptr;
<span style="color: #008000">//<span style="color: #008000"> 创建或打开内存共享区域
<span style="color: #0000ff">if((shmid=shmget(MYKEY,BUF_SIZE,IPC_CREAT))==-<span style="color: #800080">1<span style="color: #000000">){
printf(<span style="color: #800000">"<span style="color: #800000">shmget error!n<span style="color: #800000">"<span style="color: #000000">);
exit(<span style="color: #800080">1<span style="color: #000000">);
}
<span style="color: #0000ff">if((shmptr=shmat(shmid,<span style="color: #800080">0,<span style="color: #800080">0))==(<span style="color: #0000ff">void
)-<span style="color: #800080">1<span style="color: #000000">){
printf(<span style="color: #800000">"<span style="color: #800000">shmat error!n<span style="color: #800000">"<span style="color: #000000">);
exit(<span style="color: #800080">1<span style="color: #000000">);
}
<span style="color: #0000ff">while(<span style="color: #800080">1<span style="color: #000000">){
<span style="color: #008000">//<span style="color: #008000"> 把用户的输入存到共享内存区域中
printf(<span style="color: #800000">"<span style="color: #800000">input:<span style="color: #800000">"<span style="color: #000000">);
scanf(<span style="color: #800000">"<span style="color: #800000">%s<span style="color: #800000">"<span style="color: #000000">,shmptr);
}
exit(<span style="color: #800080">0<span style="color: #000000">);
}

$ -Wall shm_a.c -o demoa

#include

<span style="color: #0000ff">#define BUF_SIZE 1024
<span style="color: #0000ff">#define MYKEY 24

<span style="color: #0000ff">int main(<span style="color: #0000ff">void<span style="color: #000000">)
{
<span style="color: #0000ff">int<span style="color: #000000"> shmid;
<span style="color: #0000ff">char <span style="color: #000000">shmptr;
<span style="color: #008000">//<span style="color: #008000"> 创建或打开内存共享区域
<span style="color: #0000ff">if((shmid=shmget(MYKEY,<span style="color: #800080">0))==(<span style="color: #0000ff">void
)-<span style="color: #800080">1<span style="color: #000000">){
fprintf(stderr,<span style="color: #800000">"<span style="color: #800000">shmat error!n<span style="color: #800000">"<span style="color: #000000">);
exit(<span style="color: #800080">1<span style="color: #000000">);
}
<span style="color: #0000ff">while(<span style="color: #800080">1<span style="color: #000000">){
<span style="color: #008000">//<span style="color: #008000"> 每隔 3 秒从共享内存中取一次数据并打印到控制台
printf(<span style="color: #800000">"<span style="color: #800000">string:%sn<span style="color: #800000">"<span style="color: #000000">,shmptr);
sleep(<span style="color: #800080">3<span style="color: #000000">);
}
exit(<span style="color: #800080">0<span style="color: #000000">);
}

$ -Wall shm_b.c -o demob

System V IPC 之共享内存

、ipcmk 和 。我们可以使用 ipcs 命令查看系统中的 ipc 资源:

$ ipcs -m

System V IPC 之共享内存

$ ipcrm -M

(编辑:瑞安网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读