当前位置: 技术问答>linux和unix
linux下两进程通信的问题
来源: 互联网 发布时间:2016-05-05
本文导语: 最近在看一些进程通信的原理,程序中要考虑到两个进程之间的通信,具体方案如下: 进程A:为网络服务端程序,负责接收从客户端发送的数据 进程B:特定地执行一个功能,当进程A每次接收完数据后,通知进...
最近在看一些进程通信的原理,程序中要考虑到两个进程之间的通信,具体方案如下:
进程A:为网络服务端程序,负责接收从客户端发送的数据
进程B:特定地执行一个功能,当进程A每次接收完数据后,通知进程B做相应处理,进程B根据A的给的结果后,继续执行原特定功能
这里面涉及到了两个进程之间的通信,看了以下进程间共享内存的方法,但是还是没有什么思路,高手门能不能赐教下,怎样来设计这两个
进程间的通信,用什么方法,谢谢!!!
进程A:为网络服务端程序,负责接收从客户端发送的数据
进程B:特定地执行一个功能,当进程A每次接收完数据后,通知进程B做相应处理,进程B根据A的给的结果后,继续执行原特定功能
这里面涉及到了两个进程之间的通信,看了以下进程间共享内存的方法,但是还是没有什么思路,高手门能不能赐教下,怎样来设计这两个
进程间的通信,用什么方法,谢谢!!!
|
可以有很多方法实现进程间通信,比如:消息队列,共享内存,管道,FIFO,socket等,但具体使用什么方式要根据具体需要而定,因为这些方式都有各自的优势和局限:
使用消息队列能够实现一对多且具有优先级的通信交互,且具有很好的异步性,这使的程序架构的耦合度很低,但消息队列是内核链表没有引用计数,必须小心的处理进程异常时的残留队列的清除问题(但这通常来说不是问题),另外消息队列只能在本机之内通信,且不能使用select、poll、epoll接口等;
共享内存必须使用某种同步机制,如:信号量或文件锁等,使用它进行消息传输的话,你需要处理有界缓冲区及生产者、消费者等问题,这使你的程序变得复杂且传输的消息大小有限制,所以共享内存更适合用于数据的共享(如:某个数据结构或数据表的内容等),而不适合数据的传输;
管道/FIFO更适合哪些有亲缘关系的进程间通信,除非使用命名管道,其传输的消息大小有限制,超过限制的大消息则可能出现交叉的情况,但管道可以使用多路转接等接口;
SOCKET方式最大的好处是你的程序可以统一的处理本地消息和网络消息,但处理本地消息效率不如IPC机制高。
线程方式表面看来使处理简单了,但其实它使你的应用程序变得复杂而不稳定,尤其是程序有一定规模的时候,因此能不用线程就不用线程,尽量采用多进程方式处理。
因此:如果你的系统整体架构是采用多进程方式的话,你应该使用消息队列方式;如果你的程序是面向网络应用的,如:WEB应用,则建议采用SOCKET方式。
使用消息队列能够实现一对多且具有优先级的通信交互,且具有很好的异步性,这使的程序架构的耦合度很低,但消息队列是内核链表没有引用计数,必须小心的处理进程异常时的残留队列的清除问题(但这通常来说不是问题),另外消息队列只能在本机之内通信,且不能使用select、poll、epoll接口等;
共享内存必须使用某种同步机制,如:信号量或文件锁等,使用它进行消息传输的话,你需要处理有界缓冲区及生产者、消费者等问题,这使你的程序变得复杂且传输的消息大小有限制,所以共享内存更适合用于数据的共享(如:某个数据结构或数据表的内容等),而不适合数据的传输;
管道/FIFO更适合哪些有亲缘关系的进程间通信,除非使用命名管道,其传输的消息大小有限制,超过限制的大消息则可能出现交叉的情况,但管道可以使用多路转接等接口;
SOCKET方式最大的好处是你的程序可以统一的处理本地消息和网络消息,但处理本地消息效率不如IPC机制高。
线程方式表面看来使处理简单了,但其实它使你的应用程序变得复杂而不稳定,尤其是程序有一定规模的时候,因此能不用线程就不用线程,尽量采用多进程方式处理。
因此:如果你的系统整体架构是采用多进程方式的话,你应该使用消息队列方式;如果你的程序是面向网络应用的,如:WEB应用,则建议采用SOCKET方式。
|
如果只有这两个进程的话,实现你说的功能最简单的方法就是用消息队列了。
|
建立一个有名管道,A-B通过该管道通讯,B进程用select查询
|
系统提供的进程通信够多的了
命名pipe 共享内存 消息
不过偶推荐 unix domain socket 很不错的说 试试哈
命名pipe 共享内存 消息
不过偶推荐 unix domain socket 很不错的说 试试哈
|
进程A:为网络服务端程序,负责接收从客户端发送的数据
进程B:特定地执行一个功能,当进程A每次接收完数据后,通知进程B做相应处理,进程B根据A的给的结果后,继续执行原特定功能
楼主,你的需求其实2个线程就ok了,没必要多进程吧.一般的socket server,一个线程a就搞定了哦.然后B作为主线程,线程间的同步,数据共享也方便得多.
进程B:特定地执行一个功能,当进程A每次接收完数据后,通知进程B做相应处理,进程B根据A的给的结果后,继续执行原特定功能
楼主,你的需求其实2个线程就ok了,没必要多进程吧.一般的socket server,一个线程a就搞定了哦.然后B作为主线程,线程间的同步,数据共享也方便得多.
|
进程间通信的手段很多:管道、命名管道、socket、信号、共享内存、消息队列等等。
这么多方法你随便选,看你自己的程序适合用那种了。
使用都不复杂,不熟悉的话google一下。
这么多方法你随便选,看你自己的程序适合用那种了。
使用都不复杂,不熟悉的话google一下。
|
个人觉得 socket比较简单,去 google找下 应该有很多这样的 例子
|
本人补充几个命令,如PS PSTREE NICE RENICE 等
|
需求提得不够详细,这也正是大家给了这么多选择的原因。
甚至我可以说,fork一个进程,或者pthread_create建个线程,都可以做。
所以,能说说,为什么是需要两个进程?还有什么其他的限制条件?
甚至我可以说,fork一个进程,或者pthread_create建个线程,都可以做。
所以,能说说,为什么是需要两个进程?还有什么其他的限制条件?
|
可以用线程来实现比较方便,加上互斥锁和信号量。
|
mark