进程间通信(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

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

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