Skip to content

Latest commit

 

History

History
65 lines (55 loc) · 1.44 KB

管道.md

File metadata and controls

65 lines (55 loc) · 1.44 KB

管道

目录

概念

管道用于存储进程之间的通信数据, 为了方便理解, 可以把管道比作文件, 进程A将数据写到管道中, 进程B从管道中读取数据.
管道分为两种: 匿名管道pipe和命名管道fifo.
匿名管道只能父子进程之间通信, 命名管道支持任何两个进程之间通信.

知识准备

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

命名管道

代码:

<?php

$pipe = './test.pipe';

if (!file_exists($pipe)) {
    if (!posix_mkfifo($pipe, 0666)) {
        exit('创建命名管道失败' . PHP_EOL);
    }
}

// 创建子进程, 子进程写管道, 父进程读管道
$pid = pcntl_fork();

switch ($pid) {
    case -1:
        die('fork failed');
        break;
    case 0:
        $file = fopen($pipe, 'w');
        fwrite($file, 'hello world' );
        sleep(3);
        exit;
        break;
    default:
        $file = fopen($pipe, 'r');
        // 父进程阻塞, 直到子进程退出
        echo fread($file, 20) . PHP_EOL;
        // 父进程阻塞, 直到子进程退出
        pcntl_wait($status);
        break;
}

运行结果:

[root@e2963c647c8b www]# php fifo.php
hello world

参考