Linux进程通信之管道通信2

随机进程管道通信(无血缘关系)

读进程

<?php

/**
 * Created by PhpStorm
 * User: 北溟有鱼QAQ
 * Date: 2021-09-01
 * Time: 15:26
 * Email: 1769360227@qq.com
 */

$file = 'pipe_file';
//检测是否存在管道文件
if(!posix_access($file,POSIX_F_OK))
{
    //创建管道文件
    if(posix_mkfifo($file,0666))
    {
        fprintf(STDOUT,"create ok\r\n");
    }
}
//以读方式打开文件
$fd = fopen($file,'r');

//设置非阻塞方式
stream_set_blocking($fd,0);
while (1)
{
    $data = fread($fd,64);
    if($data){
        fprintf(STDOUT,"pid=%d recv data=%s",getmypid(),$data);
    }
}

fclose($fd);

写进程

<?php

/**
 * Created by PhpStorm
 * User: 北溟有鱼QAQ
 * Date: 2021-09-01
 * Time: 15:06
 * Email: 1769360227@qq.com
 */


$file = 'pipe_file';
//检测是否存在管道文件
if(!posix_access($file,POSIX_F_OK))
{
    //创建管道文件
    if(posix_mkfifo($file,0666))
    {
        fprintf(STDOUT,"create ok\r\n");
    }
}

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

while (1)
{

    $data = fgets(STDIN,64);
    if($data){
        $len = fwrite($fd,$data);

        fprintf(STDOUT,"pid=%d write len = %d \n",getmypid(),$len);

    }


}

fclose($fd);

验证

通过以上图片可以发现,我们实现了不同进程间的通信,这样就可以方便一些同学在使用workman 、swoole 配合其他 fpm框架使用的时候,、拿到跨进程的数据,从而实现自己的业务逻辑

注意

  • 找到管道文件,使用cat pipe_file也相当于读取管道内容

  • 当一个读进程 多个写进程时,读进程是可以正常工作获取管道内容的

  • 当一个写进程,多个读进程时,读进程会依次从管道中哪去数据,也是可以正常工作(类似于消息队列)

  • 切记,读进程一定要设置非阻塞方式运行,否则可能会出现不同效果,导致认为代码错误

北溟有鱼QAQ博客
请先登录后发表评论
  • 最新评论
  • 总共0条评论