1.简介
管道是*NIX上常见的一个东西,大家平时使用linux的时候也都在用,简单理解就是|,比如ps -aux|grep php这就是管道,大概意思类似于ps进程和grep进程两个进程之间用|完成了通信。管道是一种半双工(现在也有系统已经支持全双工的管道)的工作方式,也就是说数据只能沿着管道的一个方向进行传递,不可以在同一个管道上反向传数据。管道分为两种,一种叫做未命名的管道,另一种叫做命名管道,未命名管道只能在拥有公共祖先的两个进程之间使用,简单理解就是只能用于父进程和和其子进程之间的通信,但是命名管道则可以用于任何两个毫无关连的进程之间的通信
管道可以认为是一个队列,不同的线程都可以往里面写东西,也都可以从里面读东西。写就是在队列末尾添加,读就是在队头删除。
管道一般有大小,默认一般是4K,也就是内容超过4K了,你就只能读,不能往里面写了。
默认情况下,管道写入以后,就会被阻止,直到读取他的程序读取把数据读完。而读取进程也会被阻止, 直到有进程向管道写入数据。当然,你可以改变这样的默认属性,用stream_set_block 函数,设置成非阻断模式。
2.实现
有名管道
<?php
// 绝对路径
$pipe_file = __DIR__.DIRECTORY_SEPARATOR.'test.pipe';
// 文件是否存在
if( !file_exists( $pipe_file ) ){
// 创建管道
if( !posix_mkfifo( $pipe_file, 0666 ) ){
exit( 'create pipe error.'.PHP_EOL );
}
}
// fock进程
$pid = pcntl_fork();
if( $pid < 0 ){
exit( 'fork error'.PHP_EOL );
} else if( 0 == $pid ) {
// 打开管道
$file = fopen( $pipe_file, "w" );
// 写入管道
fwrite( $file, "helo world." );
exit;
} else if( $pid > 0 ) {
$file = fopen( $pipe_file, "r" );
// 读取管道
$content = fread( $file, 1024 );
echo $content.PHP_EOL;
pcntl_wait( $status );
}
image.png测试
3.参考资源
https://www.cnblogs.com/niniwzw/archive/2010/01/20/1652801.html
网友评论