独立的进程间通信(记录)

本文介绍了进程间通信的多种方式,如匿名管道、有名管道(命名管道/FIFO)、信号、消息队列和共享内存。命名管道克服了普通管道的限制,允许无亲缘关系的进程间通信,而信号主要用于通知消息。消息队列提供缓冲区并支持双向通信,而共享内存则允许快速的数据共享。在选择通信方式时,需根据需求考虑可靠性、广播能力等因素。
摘要由CSDN通过智能技术生成

Named Pipe

有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。

Pipe分两种,即命名Pipe和匿名Pipe。匿名Pipe是以句柄而不是以名字来进行标识的,因而也就限制了它只能在同一台机器上通讯,而不能应用于网络。命名Pipe则提供了以名字来进行标识,所以能在网络上的其它任何地方打开它。需要注意的是:命名Pipe只能在 Win NT而不是Win 95上创建(即Server端),Client端则可以是任
意平台。
  Pipe既可以单向通讯也可以双向通讯,Mailslot则只能单向通讯。Client端可以发送消息给mailslot,但不能接收消息;如果你想要接收消息,则只能创建一个新的mailslot。但mailslot有一个很大的优点:它支持数据广播。也就是说,若Client端发送一条消息,则整个网络中的同名对象都能收到。这是因为mailslot的名字的作用
域只是在本台机器上,所以可在不同机器上创建同名的mailslot,当Client端发来消息时则每一台机上的mailslot都得到了该消息的一份拷贝,并在本机上作出相应的反应。Mailslot的最大缺陷是不可靠,因为它的数据是以数据报格式来传送的,网络错误或负荷过重都会导致数据丢失。
  Pipe则较为可靠,但它不能广播。所以,如果你不需要进行广播,则Pipe是更好选择。选择Mailslot,则要对此后遇到的麻烦有充分的准备。

现在最常用的进程间通信的方式有信号、信息量、消息队列、共享内存等。

百度经验有介绍8种 无名管道(pipe),高级管道(popen)、有名管道(nemed pipe)、消息队列(message queue)、信号量(semophore)、信号(sinal)、共享内存(shared memory)、套接字(socket)。

–》管道、有名管道

管道是单向的,先进先出,提供了简单的流控制,进程读空管道或者写满管道,都将造成进程阻塞

管道包括无名管道和有名管道,前者用于父子间进程通信,后者用于任意两个进程间通信

–》信号

信号产生的条件:按键、硬件异常、进程调用kill函数将信号发送给另一个进程、用户调用kill命令将信号发送给其他进程,传递的消息比较少,主要是通知消息

–》消息队列

一个消息链表,可以把消息看作一个记录,具有特定的格式,进程可以向队列中添加消息或者读走消息,有缓冲区

–》共享内存

共享内存就是映射一段可以被其他进程访问的内存,这段共享物理内存由一个进程创建,但是多个进程都可以访问,共享内存是进程间共享数据的一种最快的方法

–》信号量

主要用于保护临界资源,进程可以根据它来判断是否能够访问某些公共资源,除了用于反复问控制外,还可以用于进程同步,相当于计数器

–》套接字

可以用于不同进程间的通信。

流式套接字:提供可靠的,面向连接的通讯流

数据包套接字:定义一种无连接的服务,通过相互独立的报文进行传输,是无序的

原始套接字:用于新的网络协议的测试

①普通管道(PIPE):通常有两种限制,一是单工,即只能单向传输;二是血缘,即常用于父子进程间(或有血缘关

系的进程间)。

②流管道(s_pipe):去除了上述的第一种限制,实现了双向传输。

③命名管道(name_pipe):去除了上述的第二种限制,实现了无血缘关系的不同进程间通信。

★管道的使用方法:

①pipe:创建一个管道,返回两个管道描述符,通常用于父子进程间的通讯。

②popen,pclose:只返回一个管道描述符,这种方式常用于通信的另一方是stdin或stdout。

③mkpipe:命名管道,在多进程间实现交互。

111

★命名管道:

     管道的一个不足之处在于管道没有一个确切的名字,所以普通管道只能用于具有血缘关系间的进程间进行通信,

而对于无血缘关系的多个进程间要实现进程间通信,普通管道已无法满足,所以促使了命名管道(name_pipe或

FIFO)的提出,而普通管道(pipe)也就被称为匿名管道。命名管道的不同之处在于其提供了一个路径名与之关

联,以FIFO的文件形式存储于文件系统中。命名管道是一个设备文件,即使多个进程不存在血缘关系,也可以访问该

路径,通过FIFO实现进程间通信。FIFO与调度算法中的FIFO同名,都是first input first output。所以按照先进先

出的原则,第一个被写入的数据首先从管道中读出。

▲命名管道的创建:

linux下命名管道的创建方式有两种:

①在Shell下交互地建立一个命名管道。Shell方式下可使用mknod或mkfifo命令。

②在程序中使用系统函数建立命名管道。相关系统函数有mknod和mkfifo。

1.mknod系统函数:

2.mkfifo系统函数:
★ mknod和mkfifo这两个函数都能创建一个FIFO文件,注意是创建一个真实存在于文件系统中的文件,filename指定了文件名,而mode则指定了文件的读写权限。mknod是比较老的函数,而使用mkfifo函数更加简单

和规范,所以建议在可能的情况下,尽量使用mkfifo而不是mknod。 mkfifo函数的作用是在文件系统中创建一个文

件,该文件用于提供FIFO功能,即命名管道。 前边讲的那些管道都没有名字,因此它们被称为匿名管道,或简称管

道。对文件系统来说, 匿名管道是不可见的,它的作用仅限于在父进程和子进程两个进程间进行通信。而命名管道是

一个可见的文件,因此,它可以用于任何两个进程之间的通信,不管这两个进程是不 是父子进程,也不管这两个进程

之间有没有关系。

对于跨平台解决方案,我建议在localhost(127.0.0.1)上的套接字之上构建类似文件的对象 - 这是IDLE默认处理的问题,以解决与您的问题非常相似的问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值