命名管道

进程间通信(管道、共享内存、消息队列、信号量)

随声附和 提交于 2020-03-07 04:59:20
进程间通信 Linux环境下,进程地址空间相互独立,每个进程各自有不同的用户地址空间。任何一个进程的全局变量在另一个进程中都看不到,所以进程和进程之间不能相互访问,要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间考到内核缓存区,进程2再内核缓存区把数据读走,内核提供这种机制称为进程间通信。通信方式有:管道、共享内存、消息对列、信号量等 管道 什么是管道呢? 我们把从一个进程连接到另一个进程的一个数据流称为一个“管道”, 管道的本质是内核中的一块缓冲区。 管道的特性 ① 半双工通信 :半双工通信(Half-duplex Communication)可以实现双向的通信,但不能在两个方向上同时进行,必须轮流交替地进行。在这种工作方式下,发送端可以转变为接收端;相应地,接收端也可以转变为发送端。但是在同一个时刻,信息只能在一个方向上传输。因此,也可以将半双工通信理解为一种切换方向的单工通信。 ②: 管道的生命周期随进程 ,进程关闭,对应的管道端口关闭,两个进程都关闭,则管道关闭。 ③: 管道自带同步与互斥 :管道为空时读取,read 阻塞;管道满时写入,write 阻塞。 ④: 管道提供字节流传输服务 管道的分类 ①:匿名管道 ②:命名管道 匿名管道 什么是匿名管道? 匿名管道之所以可以通信的本质在于,父进程frok子进程,父子进程各自拥有一个文件描述符表

进程间通信之------- 命名管道

混江龙づ霸主 提交于 2020-03-04 05:48:07
我们知道管道包括三种: 1):普通管道PIPE,通常有很多限制,一是半双工,只能单向传输,二是只能在父子进程间使用 2):流管道:这种能双向传输,但是也是只能父子进程间使用。 3):命名管道,去除了以上的第二种限制,可以在许多不相关的进程间进行通讯。也是半双工的通信方式。 但是通常我们把管道分为匿名管道和命名管道。但对于匿名管道的话,只能在本机上进程之间通信,而且只能实现本地的父子进程之间的通信,局限性太大了。而这里介绍的命名管道,就和匿名管道有些不同了,在功能上也就显得强大许多,至少其可以实现跨网络之间的进程的通信,同时其客户端既可以接收数据也可以发送数据,服务器端也是可以接收数据,又可以发送数据。 匿名管道的概述    对于匿名管道而言,命名管道使用了windows安全机制,因而命名管道的服务器端可以控制哪些客户有权与其建立连接。哪些客户端是不能够与这个命名管道建立连接的。命名管道的通信是以连接的方式进行的,服务器创建一个命名管道对象,然后在此对象上等待连接请求,一旦客户连接过来,则两者都可以通过命名管道读或者写数据。   命名管道提供了两种通信模式:字节模式和消息模式。在字节模式下,数据以一个连续的字节流的形式在客户机和服务器之间流动。而在消息模式下,客户机和服务器则通过一系列不连续的数据单位,进行数据的收发,每次在管道上发出一个消息后,它必须作为一个完整的消息读入。

进程间通信 - 命名管道实现

南笙酒味 提交于 2020-03-04 05:47:46
引子 好,到这里呢,就需要介绍实现进程间通信的第四种方式了, 也就是通过命名管道来实现,前面介绍的那三种方式呢,都是有缺陷或者说局限性太强, 而这里介绍的命名管道相对来说,在这方面就做得好很多了, 比如,剪贴板的话只能实现本机上进程之间的通信, 而邮槽的话虽然是可以实现跨网络之间的进程的通信, 但麻烦的是邮槽的服务端只能接收数据,邮槽的客户端只能发送数据,太悲剧了, 而对于匿名管道的话,其也只能实现本机上进程之间的通信, 你要是能够实现本机进程间的通信也就算了, 关键是它还只用来实现本地的父子进程之间的通信,也太局限了吧? 而这里介绍的这个命名管道的话,就和他们有些不同了,在功能上也就显得强大很多了, 至少其可以实现跨网络之间的进程的通信,同时其客户端既可以接收数据也可以发送数据, 服务端也是既可以接收数据,又可以发送数据的。 命名管道概述 命名管道是通过网络来完成进程之间的通信的,命名管道依赖于底层网络接口, 其中包括有 DNS 服务,TCP/IP 协议等等机制,但是其屏蔽了底层的网络协议细节, 对于匿名管道而言,其只能实现在父进程和子进程之间进行通信,而对于命名管道而言, 其不仅可以在本地机器上实现两个进程之间的通信,还可以跨越网络实现两个进程之间的通信。 命名管道使用了 Windows 安全机制,因而命名管道的服务端可以控制哪些客户有权与其建立连接,

Linux进程管理: 多进程编程

六眼飞鱼酱① 提交于 2020-01-17 02:13:11
多进程编程 mind-Mapping 保存有xmind原始文件,可直接获取 无名管道PIPE 命名管道FIFO POSIX共享内存 POSIX消息队列 POSIX信号量 SYS V共享内存 SYS V消息队列 SYS V信号量 来源: CSDN 作者: Z_Stand 链接: https://blog.csdn.net/Z_Stand/article/details/104011127

实现:ipc$命名管道连接

回眸只為那壹抹淺笑 提交于 2020-01-14 01:03:05
#include <windows.h> #include <WinNetWk.h> #include <iostream> #pragma comment(lib, "Mpr.lib") using namespace std; int wmain(int argc,wchar_t * argv[]) { /* DWORD WNetAddConnection2W( LPNETRESOURCEW lpNetResource, LPCWSTR lpPassword, LPCWSTR lpUserName, DWORD dwFlags ); */ LPNETRESOURCEW nr; // 定义一个LPNETRESOURCEW结构体 memset(&nr, 0, sizeof(nr)); //结构体初始化 //DWORD dwFlags; DWORD res; if (argc != 4) { cout << "Usage: ipc.exe <remotename> <username> <password>" << endl; return -1; } //LPNETRESOURCEW结构体的四个必须填写 nr->dwType = RESOURCETYPE_ANY; //任意资源类型 nr->lpLocalName = NULL; // 建立与网络资源的连接,而不会重定向本地设备

provider:命名管道提供程序,error:40 - 无法打开到SQL Server的连接 (Microsoft

核能气质少年 提交于 2020-01-13 05:23:51
最近一直在配置服务器, 这当中最头疼的就是配置数据库 我们用的是SQL Server 数据库 2008 版本,数据库配置完之后从另一台电脑访问数据库死活连接不上,提示信息如下 “ 无法连接到 . . . 。 在于SQL Server建立连接时出现与网络相关的或特定于实例的错误。未找到或无法访问服务器。请验证实例名称是否正确并且 SQL Server 已配置为允许远程连接。(proveder:命名管道提供程序,error:40 - 无法打开到 SQL Server的连接)(Microsoft SQL Server,错误:53)” 下面说说数据库配置步骤 1,如果安装的时候 已经选择 “混合模式(SQL Server 身份验证和Windows 身份验证)(M)”, 并且已经为 SQL Server 系统管理员分配了账户和密码 则不用重新配置。 配置方法如下: 用Windows 验证方法登录数据库 选择实例->右键 ->属性 ->安全性 -> 选择 “SQL Server 和 Windows 身份验证模式” -> 确定 用Windows 验证方法登录数据库 选择实例->右键 ->属性 -> 安全性->登录名->双击用户名(一般为sa)->设置密码 2,开始菜单->所有程序->Microsoft SQL Server 2008 ->配置工具 -> SQL Server 配置管理器-

provider:命名管道提供程序,error:40 - 无法打开到SQL Server的连接 (Microsoft

生来就可爱ヽ(ⅴ<●) 提交于 2020-01-05 06:41:30
最近一直在配置服务器, 这当中最头疼的就是配置数据库 我们用的是SQL Server 数据库 2008 版本,数据库配置完之后从另一台电脑访问数据库死活连接不上,提示信息如下 “ 无法连接到 . . . 。 在于SQL Server建立连接时出现与网络相关的或特定于实例的错误。未找到或无法访问服务器。请验证实例名称是否正确并且 SQL Server 已配置为允许远程连接。(proveder:命名管道提供程序,error:40 - 无法打开到 SQL Server的连接)(Microsoft SQL Server,错误:53)” 下面说说数据库配置步骤 1,如果安装的时候 已经选择 “混合模式(SQL Server 身份验证和Windows 身份验证)(M)”, 并且已经为 SQL Server 系统管理员分配了账户和密码 则不用重新配置。 配置方法如下: 用Windows 验证方法登录数据库 选择实例->右键 ->属性 ->安全性 -> 选择 “SQL Server 和 Windows 身份验证模式” -> 确定 用Windows 验证方法登录数据库 选择实例->右键 ->属性 -> 安全性->登录名->双击用户名(一般为sa)->设置密码 2,开始菜单->所有程序->Microsoft SQL Server 2008 ->配置工具 -> SQL Server 配置管理器-

进程间通信-管道

拜拜、爱过 提交于 2019-12-24 12:06:13
转自: 0giant 管道允许在进程之间按先进先出的方式传送数据,是进程间通信的一种常见方式。 管道是Linux 支持的最初Unix IPC形式之一,具有以下特点: 1) 管道是 半双工的 ,数据只能向一个方向流动; 需要双方通信时,需要建立起两个管道 ; 2) 匿名管道只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程); 3) 单独构成一种独立的文件系统:管道对于管道两端的进程而言,就是一个文件,但它不是普通的文件,它不属于某种文件系统,而是自立门户,单独构成一种文件系统,并且只存在与内存中。 管道分为pipe(无名管道)和fifo(命名管道)两种,除了建立、打开、删除的方式不同外,这两种管道几乎是一样的。他们都是通过内核缓冲区实现数据传输。 pipe用于相关进程之间的通信,例如父进程和子进程,它通过pipe()系统调用来创建并打开,当最后一个使用它的进程关闭对他的引用时,pipe将自动撤销。 FIFO即命名管道, 在磁盘上有对应的节点,但没有数据块 ——换言之,只是拥有一个名字和相应的访问权限,通过mknode()系统调用或者mkfifo()函数来建立的。一旦建立,任何进程都可以通过文件名将其打开和进行读写,而不局限于父子进程,当然前提是进程对FIFO有适当的访问权。当不再被进程使用时,FIFO在内存中释放,但磁盘节点仍然存在。 管道的实质是一个内核缓冲区

rebar3使用run_erl运行erlang项目

你说的曾经没有我的故事 提交于 2019-12-10 08:30:56
在rebar3创建的项目中,启动的脚本是: "$BINDIR/run_erl" -daemon "$PIPE_DIR" "$RUNNER_LOG_DIR" \ "$(relx_start_command)" 搜索一番是通过run_erl运行erlang项目,里面用到了命名管道。 然后可以通过to_erl连接运行中的erlang项目 参考: [Erlang危机](4.4)命名管道 来源: oschina 链接: https://my.oschina.net/u/191928/blog/653851

linux系统编程:命名管道FIFO和mkfifo函数

本秂侑毒 提交于 2019-12-09 20:50:10
进程间通信必须通过内核提供的通道,而且必须有一种办法在进程中标识内核提供的某个通道,前面讲过的 匿名管道 是用打开的文件描述符来标识的。如果要互相通信的几个进程没有从公共祖先那里继承文件描述符,它们怎么通信呢?内核提供一条通道不成问题,问题是如何标识这条通道才能使各进程都可以访问它?文件系统中的路径名是全局的,各进程都可以访问,因此可以用文件系统中的 路径名 来标识一个IPC通道。 FIFO和UNIX Domain Socket这两种IPC机制都是利用文件系统中的 特殊文件 来标识的。 FIFO文件在磁盘上没有数据块,仅用来标识内核中的一条通道 ,如 prw-rw-r-- 1 simba simba 0 May 21 10:13 p2,文件类型标识为p表示FIFO,文件大小为0。 各进程可以打开这个文件进行read/write,实际上是在读写内核通道(根本原因在于这个file结构体所指向的read、write函数和常规文件不一样),这样就实现了进程间通信。UNIX Domain Socket和FIFO的原理类似,也需要一个特殊的socket文件来标识内核中的通道,例如/run目录下有很多系统服务的socket文件: srw-rw-rw- 1 root root 0 May 21 09:59 acpid.socket ....................