进程通讯(一)--有名管道

18 篇文章 0 订阅
17 篇文章 0 订阅
  进程间通讯的意义很多书上都有说,总之是非常重要的一部分,就不多啰嗦了,简单来说是为了完成进程间的协作功能。
  然而进程间的通讯方式也不少,信号,信号量,管道,共享内存.....
  今天先来说说管道中的有名管道。当然有 有名管道自然也有无名管道。至于他俩的区别,我们暂且记着有名管道是可以让同一台计算机上的任意两个无关系的进程通信。而 无名管道则是必须需要通信的进程间存在关系,比如父子进程。
  有名管道的原理是什么呢?有名管道的管道具体在计算机的哪个地方呢?
  请看下面这张示意图
   
有名管道是在进程使用管道时在系统内存上开辟的一段空间,如果A需要给B传递某些信息,A进程就给那段开辟的空间里写入数据,而B也从那段开辟的空间里读取数据,并且重要的一点是管道保存的数据是未被进程读的,或者说B读数据就好比循环队列,读过的数据就出队消毁了,不会停留在管道中被重复读取,就好比接电话,音过了就过了,不会为你保存一份录音 供你重复听。
既然是内存上开辟的空间。那就说明管道不会占用磁盘的空间。
管道文件好比是一个标记。供使用这个标记的进程们在运行时 使用同一段指定的内存 进行通讯,读写数据。

创建管道有两种形式
是在命令窗口使用 mkfifo 管道名 
是代码中调用系统 函数 mkfifio();
之后的操作就把管道看作文件,使用文件操作就好
   打开:  open   写数据: write   读数据: read   关闭: close
值得注意的是对管道的一些文件操作函数会阻塞运行
何为阻塞运行?就是 函数调用以后并不会立即返回,需要等待某些条件的发生才会返回。
如果一个进程以只写方式打开一个管道文件, open就 会阻塞运行,直到一个进程以读方式打开文件该管道文件, open 才会返回,进程才会继续执行。
这样设计的目的何在?我们都知道管道是为了传输数据,如果没有要传给的对象,也就是没有其他进程读取管道内容,那么给管道标记的那段内存写数据将没有意义,浪费内存空间,而且我们之前也说了管道的那段内存是循环队列,只有读数据才会把内存的数据出队,没进程使数据出队,一个劲儿的写,势必也是不好的。当然的,一般不会出现管道写入数据把内存挤爆的情况,因为管道是有默认大小的。
  read也会阻塞运行。如果其他进程没有给管道写入数据 或者 写入数据的进程全部关闭了。read当然没有读的意义了,就会阻塞运行。
  write虽然也会阻塞运行,但阻塞条件比较难达成,就是管道写满的情况。
  之前也说了管道是有大小的,会写满,那么它究竟有多大呢?
  写个简单的代码测试一下


写了65536个a后就阻塞住了,65536个字节=2^16 byte=2^6 kb=64k
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Electron-Vue 中进程通讯可以通过使用 `ipcRenderer` 和 `ipcMain` 进行实现。 `ipcRenderer` 是在渲染进程中使用的模块,它负责发送异步消息到主进程中的 `ipcMain`,并且接收主进程回复的消息。使用 `ipcRenderer.send(channel, args)` 向主进程发送消息,使用 `ipcRenderer.on(channel, listener)` 监听主进程发送过来的消息。 `ipcMain` 是在主进程中使用的模块,它负责接收来自渲染进程发送过来的异步消息,并且处理消息后通过 `event.sender.send()` 方法向渲染进程发送回复消息。使用 `ipcMain.on(channel, listener)` 监听渲染进程发送过来的消息。 下面是一个简单的示例,演示了如何在渲染进程和主进程之间进行简单的通讯: ```js // 在渲染进程中 const { ipcRenderer } = require('electron') ipcRenderer.send('message', 'Hello World!') ipcRenderer.on('reply', (event, arg) => { console.log(arg) }) // 在主进程中 const { ipcMain } = require('electron') ipcMain.on('message', (event, arg) => { console.log(arg) event.sender.send('reply', 'Hi there!') }) ``` 在上面的示例中,渲染进程通过 `ipcRenderer.send()` 方法向主进程发送了一个消息,主进程通过 `ipcMain.on()` 方法监听渲染进程发送过来的消息,处理完消息后通过 `event.sender.send()` 方法向渲染进程发送了一个回复消息。渲染进程通过 `ipcRenderer.on()` 方法监听主进程发送过来的回复消息,并且在控制台输出了回复消息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值