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默认处理的问题,以解决与您的问题非常相似的问题。