php 管道,PHP 进程间通信---管道篇

【1、管道概念】

* 管道是单向的、先进先出的,他把进程的输出和另一个进程的输入连接在一起。

* 一个进程在管道的尾部写入数据,另一个进程在管道的头部读取数据。

* 数据被从管道中读取出来之后,将被删除,其他进程无法在读取到相应的数据。

* 管道提供了简单的流控制,进程读取空管时候,将被阻塞。同时进程写入一个满了的管道也将被阻塞,知道另一方写入或者读取管道。

* 管道包含无名管道和有名管道,前者用于父进程和子进程之间的通信,后者用于任意两个进程之间的通信。本文主要讲有名管道

【2、管道涉及的函数】

posix_mkfifo(string $pathname, int $mode):bool    : 创建一个有名管道

* pathname : 创建管道的路径。

* mode  : 管道文件的权限模式。参考liunx 文件权限 例 0666、0755、0777

unlink(string $pathname):bool    : 删除管道文件

* pathname  : 文件路径

【3、举个栗子】

$pathname='./'.getmypid().'.pipe';

if(!is_file($pathname))

{

posix_mkfifo($pathname,0666);

}

//复制一个子进程

$pid=pcntl_fork();

if($pid==0)

{

$file=fopen($pathname,'r');

while(true)

{

echo '子进程读取:'.fread($file,20).PHP_EOL;

sleep(1);

}

fclose($file);

exit;

}

//父进程继续执行

$file=fopen($pathname,'w');

while(true)

{

echo '父进程写入:'.fwrite($file,time()).PHP_EOL;

sleep(1);

}

fclose($file);

pcntl_wait($status);

5034853b4b057577b201c85096733d1d.png

注:当前模式为阻塞模式,只有当fread 读取到对应的size大小时,才会返回,否则将阻塞运行。可以使用 stream_set_blocking(resource $pathname,false);来使用非阻塞模式;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值