System V 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
#include
<span style="color: #0000ff">void
#include
<span style="color: #0000ff">int
#include
<span style="color: #0000ff">int SHM_LOCK:将共享内存区域上锁。IPC_RMID:用于删除共享内存。IPC_SET:按参数 buf 指向的结构中的值设置该共享内存对应的 shmid_ds 结构。IPC_STAT:用于取得该共享内存区域的 shmid_ds 结构,保存到 buf 指向的缓冲区。SHM_UNLOCK:将上锁的共享内存区域释放。
#include
<span style="color: #0000ff">#define <span style="color: #0000ff">#define <span style="color: #0000ff">int { <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 <span style="color: #0000ff">#define <span style="color: #0000ff">int { <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
、ipcmk 和 。我们可以使用 ipcs 命令查看系统中的 ipc 资源: $ ipcs -m
$ ipcrm -M
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |