您的位置:首页 > 运维架构 > Linux

如何实现Linux进程之间的通信?

2017-08-28 19:33 399 查看

多进程基础

多进程在程序当中执行的顺序.

<?php

$pid = pcntl_fork();
//父进程和子进程都会执行下面代码
if ($pid == -1) {
//错误处理:创建子进程失败时返回-1.
die('could not fork');
} else if ($pid) {
//父进程会得到子进程号,所以这里是父进程执行的逻辑
pcntl_wait($status); //等待子进程中断,防止子进程成为僵尸进程。
} else {
//子进程得到的$pid为0, 所以这里是子进程执行的逻辑。
}


进程的信号注册

function sig_handler($signo){

echo $signo;
}
pcntl_singal(SIGHUP, 'sig_handler');//注册信号
//获取当前的进程ID
pcntl_kill(posix_getpid(),SIGHUP,);//向当前ID发送HUP信号
pcntl_signal_dispatch();//分发信号


(shm mem msg) Preview

在进行一下方式之前确保PHP开启了如下的扩展.

--enable-sysvsem
--enable-sysvshm
--enable-sysvmsg


这里只是写一下PHP的代码,各个语言环境可能实现不同.

ftok($pathName)//从文件路径获得一个System V IPC key  比较重要 在共享内存,信号量会用到
shm_attach($key, $memSize, $prem = 0666)//根据key获取一块共享内存
mixed shm_get_var ( resource $shm_identifier , int $variable_key ) //shm_identifier指明是哪一块共享内存, 根据variable_key获取value
bool shm_has_var ( resource $shm_identifier , int $variable_key )//判断$variable_key 是否在共享内存当中存在
bool shm_put_var ( resource $shm_identifier , int $variable_key , mixed $variable ) //抽象一下 相当于一个hashtable  $variable_key  => $variable 存入指定的共享内存
shm_remove(resource $shm_identifier)//彻底将共享内存的资源从系统当中删除

//信号量:
resource sem_get ( int $key [, int $max_acquire = 1 [, int $perm = 0666 [, int $auto_release = 1 ]]] )//根据key生成一个信号量资源
bool sem_acquire ( resource $sem_identifier [, bool $nowait = false ] )//根据信号量资源,会一直阻塞到信号量被获取
bool sem_release ( resource $sem_identifier )//释放信号量,别的进程可以获取
bool sem_remove ( resource $sem_identifier )//彻底删除信号量

//队列
resource msg_get_queue ( int $key [, int $perms = 0666 ] )//创建或者获取一个队列
bool msg_queue_exists ( int $key )//判断队列是否存在

bool msg_receive ( resource $queue , int $desiredmsgtype , int &$msgtype , int $maxsize , mixed &$message [, bool $unserialize = true [, int $flags = 0 [, int &$errorcode ]]] )//从队列当中获取数据,$maxsize设置最大内存用来保存接收到的数据,$flag可以设置非阻塞模式等,$deseiredmsgtype 指定需要的类型的消息
bool msg_send ( resource $queue , int $msgtype , mixed $message [, bool $serialize = true [, bool $blocking = true [, int &$errorcode ]]] )
bool msg_remove_queue ( resource $queue )//彻底删除内存队列


共享内存

信号量&共享内存

信号量也可以用来进行通信,当一个进程结束后会释放信号量,那么别的程序就会获取.如此一来就可以通过其中一个进程的结束释放信号量来通知另一个进程,但是信息量比较少.缺点是:交流信息最少,在php-fpm模式下不是一个好的实现,另一个进程只能知道执行完成,结合共享内存那么就可以实现的更完善信息交流机制.

信号量相当于一个加锁的机制存在,放止多进程产生竞态.

消息队列

System V 消息队列

socket

socket广泛被用于一个网络通信,当然也可以被用于进程之间的通信.

在C语言创建socket选择AF_UNIX就可以创建一个Unix套接字

Linux信号机制

当其中的以个进程获取到了另一个进程的PID,就可以发送信号给相应的进程,进程做出相应的处理.以这种方式实现只能是针对Linux定义的信号,信息也是有限的,但是实现比较简单.

Git hub demo地址:https://github.com/liuzexin/Linux-interprocess-community.git
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  linux