PHP进程间通信是如何实现的,进程间通信的方式
1.管道
管道,通常指无名管道,是 UNIX 系统IPC最古老的形式。
1.匿名管道:
概念:在内核中申请一块固定大小的缓冲区,程序拥有写入和读取的权利,一般使用fork函数实现父子进程的通信。
2.命名管道:
FIFO,也称为命名管道,它是一种文件类型。
概念:在内核中申请一块固定大小的缓冲区,程序拥有写入和读取的权利,没有血缘关系的进程也可以进程间通信。
3.特点:
1.面向字节流,
2.生命周期随内核
3.自带同步互斥机制。
4.半双工,单向通信,两个管道实现双向通信。
4.匿名管道原型1 #include
2 int pipe(int fd[2]); // 返回值:若成功返回0,失败返回-1
当一个管道建立时,它会创建两个文件描述符:fd[0]为读而打开,fd[1]为写而打开。如下图:
要关闭管道只需将这两个文件描述符关闭即可。
5.匿名管道例子
单个进程中的管道几乎没有任何用处。所以,通常调用 pipe 的进程接着调用 fork,这样就创建了父进程与子进程之间的 IPC 通道。如下图所示:
若要数据流从父进程流向子进程,则关闭父进程的读端(fd[0])与子进程的写端(fd[1]);反之,则可以使数据流从子进程流向父进程。#include
#include
int main()
{
int fd[2]; // 两个文件描述符
pid_t pid;
char buff[20];
if(pipe(fd)
printf("Create Pipe Error!\n");
if((pid = fork())
printf("Fork Error!\n");
else if(pid > 0) // 父进程
{
close(fd[0]); // 关闭读端
write(fd[1], "hello world\n", 12);
}
else
{
close(fd[1]); // 关闭写端
read(fd[0], buff, 20);
printf("%s", buff);
}
return 0;
}
6.命名管道原型#include
// 返回值:成功返回0,出错返回-1
int mkfifo(const char *pathname, mode_t mode);
其中的 mode 参数与open函数中的 mode 相同。一旦创建了一个 FIFO,就可以用一般的文件I/O函数操作它。
当 open 一个FIFO时,是否设置非阻塞标志(O_NONBLOCK)的区别:若没有指定O_NONBLOCK(默认),只读 open 要阻塞到某个其他进程为写而打开此 FIFO。类似的,只写 open 要阻塞到某个其他进程为读而打开它。
若指定了O_NONBLOCK,则只读 open 立即返回。而只写 open 将出错返回 -1 如果没有进程已经为读而打开该 FIFO,其errno置ENXIO。
7.命名管道原型
FIFO的通信方式类似于在进程中使用文件来传输数据,只不过FIFO类型文件同时具有管道的特性。在数据读出时,FIFO管道中同时清除数据,并且“先进先出”。下面的例子演示了使用 FIFO 进行 IPC 的过程:
write_fifo.c#include
#include // exit
#include // O_WRONLY
#include
#include // time
int main()
{
int fd;
int n, i;
char buf[1024];
time_t tp;
printf("I am %d process.\n", getpid()); // 说明进程ID
if((fd = open("fifo1", O_WRONLY))
{
perror("Open FIFO Failed");
exit(1);
}
for(i=0; i<10; ++i)
{
time(&tp); // 取系统当前时间
n=sprintf(buf,"Process %d's time is %s",getpid(),ctime(&tp));
printf("Send message: %s", buf); // 打印
if(write(fd, buf, n+1)
{
perror("Write FIFO Failed");
close(fd);
exit(1);
}
sleep(1); // 休眠1秒
}
close(fd); // 关闭FIFO文件
return 0;
}
read_fifo.c#include
#include
#include
#include
#include
int main()
{
int fd;
int len;
char buf[1024];
if(mkfifo("fifo1", 0666)
perror("Create FIFO Failed");
if((fd = open("fifo1", O_RDONLY))
{
perror("Open FIFO Failed");
exit(1);
}
while((len = read(fd, buf, 1024)) > 0) // 读取FIFO管道
printf("Read message: %s", buf);
close(fd); // 关闭FIFO文件
return 0;
}
在两个终端里用 gcc 分别编译运行上面两个文件,可以看到输出结果如下:[root@VM_0_15_centos fifo]# ./write
I am 9102 process.
Send message: Process 9102's time is Fri Apr 17 10:12:00 2013
Send message: Process 9102's time is Fri Apr 17 10:12:01 2013
Send message: Process 9102's time is Fri Apr 17 10:12:02 2013
Send message: Process 9102's time is Fri Apr 17 10:12:03 2013
Send message: Process 9102's time is Fri Apr 17 10:12:04 2013
Send message: Process 9102's time is Fri Apr 17 10:12:05 2013
Send message: Process 9102's time is Fri Apr 17 10:12:06 2013
Send message: Process 9102's time is Fri Apr 17 10:12:07 2013
Send message: Process 9102's time is Fri Apr 17 10:12:08 2013
Send message: Process 9102's time is Fri Apr 17 10:12:09 2013[root@VM_0_15_centos fifo]# ./read
Read message: Process 9102's time is Fri Apr 17 10:12:00 2020
上述例子可以扩展成 客户进程—服务器进程 通信的实例,write_fifo的作用类似于客户端,可以打开多个客户端向一个服务器发送请求信息,read_fifo类似于服务器,它适时监控着FIFO的读端,当有数据时,读出并进行处理,但是有一个关键的问题是,每一个客户端必须预先知道服务器提供的FIFO接口,下图显示了这种安排:
2.消息队列
1.概念:在内核中创建一队列,队列中每个元素是一个数据报,不同的进程可以通过句柄去访问这个队列。消息队列提供了⼀个从⼀个进程向另外⼀个进程发送⼀块数据的⽅法。 每个数据块都被认为是有⼀个类型,接收者进程接收的数据块可以有不同的类型值 .消息队列也有管道⼀样的不⾜,就是每个消息的最⼤⻓度是有上限的(MSGMAX),每个消息队 列的总的字节数是有上限的(MSGMNB),系统上消息队列的总数也有⼀个上限(MSGMNI)
2.特点:
1. 消息队列可以认为是一个全局的一个链表,链表节点钟存放着数据报的类型和内容,有消息队列的标识符进行标记。
2.消息队列允许一个或多个进程写入或者读取消息。
3.消息队列的生命周期随内核。
4.消息队列可实现双向通信。
3.信号量
1.概念
在内核中创建一个信号量集合(本质是个数组),数组的元素(信号量)都是1,使用P操作进行-1,使用V操作+1,
(1) P(sv):如果sv的值⼤大于零,就给它减1;如果它的值为零,就挂起该进程的执⾏ 。
(2) V(sv):如果有其他进程因等待sv而被挂起,就让它恢复运⾏,如果没有进程因等待sv⽽挂起,就给它加1。
PV操作用于同一进程,实现互斥。
PV操作用于不同进程,实现同步。
2.功能:
对临界资源进行保护。
4.共享内存
1.概念:
将同一块物理内存一块映射到不同的进程的虚拟地址空间中,实现不同进程间对同一资源的共享。
共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式。
2.特点:
1.不用从用户态到内核态的频繁切换和拷贝数据,直接从内存中读取就可以。
2.共享内存是临界资源,所以需要操作时必须要保证原子性。使用信号量或者互斥锁都可以。
3.生命周期随内核。
5.总结
所有的以上的方式都是生命周期随内核,不手动释就不会消失。
1.管道:速度慢,容量有限,只有父子进程能通讯
2.FIFO:任何进程间都能通讯,但速度慢
3.消息队列:容量受到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题
4.信号量:不能传递复杂消息,只能用来同步
5.共享内存区:能够很容易控制容量,速度快,但要保持同步,比如一个进程在写的时候,另一个进程要注意读写的问题,相当于线程中的线程安全,当然,共享内存区同样可以用作线程间通讯,不过没这个必要,线程间本来就已经共享了同一进程内的一块内存
版权声明:本文由PHP面试资料网发布,如需转载请注明出处。
PHP进程间通信是如何实现的,进程间通信的方式相关推荐
- 深刻理解linux进程间通信 pdf,深刻理解Linux进程间通信.doc
深刻理解Linux进程间通信.doc 深刻理解 Linux 进程间通信(IPC)级别 初级 郑彦兴 国防科大计算机学院 2002 年 12 月 11 日 一个大型的应用系统,往往需要众多进程协作,进程 ...
- 【进程、线程和进程间通信】(三)进程间通信
进程间通信 一.进程间通信 1.进程间通信方式 2.无名管道 (1)管道创建:pipe (2)特点 (3)读写特性 (4)示例代码 pipe.c pipe2.c 3.有名管道 (1)管道创建:mkfi ...
- 进程间通信(IPC)的几种方式
进程间通信(IPC) 1.常见的通信方式 2.低级IPC方法 文件 3.常用于本机的IPC机制 3.1无名管道pipe 3.2命名管道FIFO 3.3消息队列MessageQueue 3.4共享内存S ...
- 进程间通信那种效率最高_进程间通信的几种方式的介绍及比较
进程间通信就是在不同进程之间传播或交换信息,那么不同进程之间存在着什么双方都可以访问的介质呢?进程的用户空间是互相独立的,一般而言是不能互相访问的,唯一的例外是共享内存区.但是,系统空间却是" ...
- 【Linux系统编程】进程间通信概述
00. 目录 文章目录 00. 目录 01. 进程间通信概述 02. 进程间通信目的 03. 进程间通信机制 04. 附录 01. 进程间通信概述 进程是一个独立的资源分配单元,不同进程(这里所说的进 ...
- 210127阶段三进程间通信-消息队列
目录 一.学习的知识点 1 回顾 1.1 1.2 2 进程间通信 2.1进程间通信的目的 2.2 进程间通信 2.2.1 消息队列 二.上课没有听懂或者没有理解的地方 三.当天学习的收获 一.学习的知 ...
- 读进程和写进程同步设计_浅谈unix进程进程间通信IPC原理
什么是进程进程间通信 进程间通信即为不同进程之间通信,进程同步是进程间通信的一种 unix进程间通信的分类有哪些 System V进程间通信方式包含: System V消息队列 System V信号量 ...
- linux之进程间通信--使用信号
一.什么是信号 用过Windows的我们都知道,当我们无法正常结束一个程序时,可以用任务管理器强制结束这个进程,但这其实是怎么实现的呢?同样的功能在Linux上是通过生成信号和捕获信号来实现的,运行中 ...
- [转载]使用命名管道实现进程间通信
使用命名管道实现进程间通信 来源 : VChelp 4.5 进程间通信 在Win32下提供的进程间通信方式有以下几种: 剪贴板Clipboard:在16位时代常使用的方式,CWnd类中提供了支持. C ...
最新文章
- SAP RETAIL WR60 商品补货参数概述
- 8000 字 + 21 张图,服务端高并发分布式架构 14 次演进之路
- c语言 getch头文件,用getch()需要头文件吗?
- java用继承编写宠物乐园_MoreThanJavaDay 5:面向对象进阶继承详解
- Oracle 11g 中告警日志的位置
- 【C++】error C2275 “XXXX” 将此类型用作表达式非法
- 内核aio_今天来说说令人让人傻傻分不清的BIO,NIO,AIO
- python知识点汇总百度文库_PYTHON知识点汇总.doc
- 梦回JavaScript--数据类型之undefined
- cclink 和发那科机器人_FANUC机器人焊枪工具坐标系设定
- 句句真研—每日长难句打卡Day21
- 用python画滑稽表情_Python-画一个滑稽
- 央行开通个人信用报告在线查询服务
- 爱思服务器能不能更新苹果手机系统,苹果手机系统升级带来的利和弊,你知道多少?...
- Vijos1197 费解的开关 枚举+位运算
- 程序员副业接单做私活避坑指南
- 布尔 (boolean) 型变量只能取两个值,True 和 False。当把布尔型变量用在数字运算中,用 1 和 0 代表 True 和 False。
- web利用腾讯云点播上传视频
- 三维叉乘怎么算_自然资源管理,三维GIS能做什么?
- O2OA V4 Build 11.13 发布! 支持语音办公、微信钉钉消息群发
热门文章
- java 获得当前时间_JAVA中获取当前系统时间
- 小米电视 请输入正确的服务器,小米盒子无法共享电脑资源,总是说请输入服务器正确的用户名和密码...
- 北风网java微信_北风网微信第一季菜单5
- 带你彻底理解RSA算法原理
- ceph设置副本的数目-2019014补
- Web小轩:第一次做淘宝主页
- video自动播放 隐藏播放控制条,并且用点击 video 元素的时候 控制暂停和播放...
- 中南大学c语言试题期末考试,中南大学c语言考试-中南大学c语言用什么教材
- Docker网络模型原理
- 更彻底清理微信存储空间让小存储手机继续生存