原文:https://blog.csdn.net/why444216978/article/details/104585099
https://www.cnblogs.com/nickbai/articles/6124466.html
共享内存:使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。
一.Linux下进程间通信的几种主要手段简介:
1.管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信;
管道包括三种:1)普通管道PIPE, 通常有种限制,一是半双工,只能单向传输;二是只能在父子进程间使用. 2)流管道s_pipe: 去除了第一种限制,可以双向传输. 3)命名管道:name_pipe, 去除了第二种限制,可以在许多并不相关的进程之间进行通讯.
2.信号(Signal):信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身;Linux除了支持Unix早期信号语义函数sigal外,还支持语义符合Posix.1标准的信号函数sigaction(实际上,该函数是基于BSD的,BSD为了实现可靠信号机制,又能够统一对外接口,用sigaction函数重新实现了signal函数);
3.报文(Message)队列(消息队列):消息队列是消息的链接表,包括Posix消息队列systemV消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。
4.共享内存:使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。
5.信号量(semaphore):主要作为进程间以及同一进程不同线程之间的同步手段。
6.套接口(Socket):更为一般的进程间通信机制,可用于不同机器之间的进程间通信。起初是由Unix系统的BSD分支开发出来的,但现在一般可以移植到其它类Unix系统上:Linux和System V的变种都支持套接字。
-----------------------------------
创建并写入数据
<?php $file = __FILE__; $key = ftok($file, 1); $size = 4096; $shmid = shmop_open($key, 'c', 0644, $size); if($shmid === false){ die('create fail'); } $data = 'hello world'; $packData = pack('a*', $data); //数据压缩成二进制字符串,null填充 $dataSize = shmop_write($shmid, $packData, 0); //第三个参数代表开始写入数据的位置 if($dataSize === false){ die('write fail'); } shmop_close($shmid); exit('success!');
-
success!
-
[Done] exited with code=0 in 0.287 seconds
-
$ ipcs -m
-
IPC status from <running system> as of Sun Mar 1 00:51:42 CST 2020
-
T ID KEY MODE OWNER GROUP
-
Shared Memory:
-
m 983040 0x31040c43 --rw-r--r-- why staff
另一个进程读取并释放
<?php $file = __FILE__; $key = ftok($file, 1); $size = 4096; $shmid = shmop_open($key, 'a', 0644, $size); if($shmid === false){ die('create fail'); } $data = shmop_read($shmid, 0, $size); if($data === false){ die('read fail'); } $res = unpack('a*', $data); print_r($res[1]); $res = shmop_delete($shmid); if($res === false){ die('delete fail'); } shmop_close($shmid);
-
hello world
-
[Done] exited with code=0 in 0.288 seconds
-
$ ipcs -m
-
IPC status from <running system> as of Sun Mar 1 00:55:43 CST 2020
-
T ID KEY MODE OWNER GROUP
-
Shared Memory: