如何实现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 实现两个进程之间的通信
- Linux下的有名管道(05)---使用两个管道实现两个进程之间的通信(对讲机模式)
- 【linux】mkfifo 命令创建命名管道实现进程之间通信
- Linux下的有名管道(06)---使用两个管道实现两个进程之间的通信(手机模式)
- 【linux】mkfifo 命令创建命名管道实现进程之间通信
- linux中利用有名管道实现进程之间的通信
- linux下通过共享内存在进程之间实现通信(system V)
- Linux进程间通信-----使用数据报套接字实现两个进程之间的通信
- 进程通信之内存地址映射与共享,同时如何在Linux0.11下实现共享内存
- [转]如何在C#用WM_COPYDATA消息来实现两个进程之间传递数据
- 在C#中如何实现Form与Form之间的通信
- 如何实现进程间的通信
- 如何在C#用WM_COPYDATA消息来实现两个进程之间传递数据
- 如何在C#用WM_COPYDATA消息来实现两个进程之间传递数据
- 如何在C#用WM_COPYDATA消息来实现两个进程之间传递数据
- 如何在windows和、Unix/linux之间实现文件共享
- linux下如何自动检测并重新启动一个死掉的进程(shell脚本实现)
- 如何在C#用WM_COPYDATA消息来实现两个进程之间传递数据
- 在C#中如何实现Form与Form之间的通信(winform 内容)
- 在C#中如何实现Form与Form之间的通信