linux向应用软件提供下列进程间通信手段:
####第一类通信方式:只能用于父进程与子进程之间,或者两个兄递进程之间。
>管道Pipe
>信号Signal
>跟踪Trace
管道:由父进程来建立。管道两端的进程各自都将该管道视作一个文件。一个进程往管道中写的内容由另一个进程从管道中读取,通过管道传递的内容遵循先入先出FIFO的规则。每个管道都是单向的,需要双向通信时就要建立起两个管道。
信号:signal可用于进程间通信,也用于内核与进程之间的通信(内核只能向进程发送信号而不能接收)。发送信号时需要用到对方的pid,而一般只有父子进程才知道对方的pid,所以实际上还是只能用于父子进程。
跟踪:一个进程可以通过系统调用ptrace()读/写其子进程地址空间中的内容,从而达到跟踪子进程执行的目的。跟踪是单向的。
第二种通信方式:
>命名管道Named Pipe
>报文Message
>共享内存
>信号量Semaphore
>套接字Socket
命名管道:命名管道以FIFO文件的形式出现在文件系统中,所以任何进程都可以通过使用其文件名来打开管道,然后进行读写。
报文队列:一个进程可以通过系统调用设立一个报文队列。任何进程都可以通过系统调用向这个队列发送消息或从队列中接收信息,从而以进程间报文传递的形式实现通信。
共享内存:一个进程可以通过系统调用设立一片共享内存区,然后其它进程就可以通过系统调用将该存储区映射到其用户地址空间中。
套接字:socket可以用来实现分布于不同计算机中的进程通过网络进行的通信。只要双方都有一样的套接字,并且两个套接字之间有通信线路相连接,就可以完成双方通信。socket相当于管道两端的阀门。
>socket原语:
SOCKET:创建一个新的通信端点
BIND:将一个本地地址关联到一个套接字
LISTEN:宣布愿意接受连接,指定队列大小
ACCEPT:阻塞调用方,直到有连接到来
CONNECT:主动尝试建立连接
RECV:从指定连接中接收数据
SEND:在指定连接上发送数据
CLOSE:释方指定的连接