问题标签 [interprocess]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
524 浏览

c++ - 进程间映射与映射/无序映射

关于 std::map 和 boost::unordered_map 之间的区别有很多讨论。但是 boost::interprocess::map 呢?

有人在 boost::interprocess::map 和 std::map 之间进行了性能测试吗?

我没有过多地使用 interprocess::map ,但我感觉超过 1M 的元素,它变得非常慢。

谢谢

0 投票
3 回答
234 浏览

file - 中间文件是不好的做法吗?

我最近对我给出的这个问题的答案投了反对票(这只让我有点烦恼:))。该人没有对否决票提供任何解释,这让我开始思考:“为什么要避免生成中间文件?” 尤其是在像 Python 这样的语言中,文件 IO 非常简单。

似乎人们一致认为这是一个坏主意,但我知道中间文件在实践中经常使用。我在一家非常受人尊敬的研究公司工作(假设没有这家公司就不会存在 SO),假设您的程序会生成文件作为输出。我们这样做是因为如果您的程序确实应该成为一个独立的程序,那么它需要可调试的输出以及在进程之间传递其输出的某种方式,以便稍后在我们在下游发现输出中的错误时进行检查。

使用中间文件是否被认为是不好的做法(在上面链接的问题的情况下)?为什么?

0 投票
3 回答
2896 浏览

bash - 如何在 Bash 中将键盘和命名管道连接到 STDIN?

我试图找到一种调用交互式命令行程序的方法,以便它直接从键盘和命名管道获取输入。我的目标是让它与 MATLAB 一起工作,但我认为 Bash 和一个例子一样好用。所以这个想法是启动 Bash,一旦它运行,我就可以输入命令,使用向上箭头查看历史记录等,还可以将命令发送到命名管道。几天来我一直在四处寻找和摆弄这个,但到目前为止我所尝试的一切都没有奏效。

例如,在https://serverfault.com/questions/171095/how-do-i-join-two-named-pipes-into-single-input-stream-in-linux有一个有用的线程建议做类似的事情这:

这几乎正​​是我正在寻找的,除了如果您尝试使用退格键或箭头键,它就无法正常工作。(我想这是因为cat拦截击键,这通常由 bash 中的 readline 库处理?)还有其他建议吗?

最终我想有一种方法来启动一个 MATLAB 进程,这样我就可以从 TextMate 向它发送命令,但也可以在终端中与它进行交互。我在工作中使用 MATLAB,但不太喜欢它的 GUI 或编辑器。

编辑 2010 年 12 月 19 日

感谢所有非常有用的建议!我想为任何感兴趣的人总结一下这个结果。我调查了rlwrap,但由于我的目标是让它在任何人都可以使用的 TextMate 包中工作,所以我对依赖非标准实用程序(我应该首先提到的)犹豫不决。expect我也简单地检查了unbuffer一下,但是,好吧,它们看起来很复杂,我只是没有勇气去深入研究。

screen为此工作得很好 - 如下所示,我可以打开终端,开始screen,开始matlab -nodesktop,然后可以让 TextMate,例如,使用screen -X ...TextMate 命令将选定的文本发送到 Matlab。我注意到这种方法的缺点是:

  1. 发送超过 1,024 个字符的文本块会导致“屏幕”出错;我认为某处有一些缓冲区不能容纳更多,但没有花任何时间试图追踪它。
  2. 屏幕有自己的回滚缓冲区,使终端的滚动条毫无用处。也许有一个选项可以改变它的工作方式?
  3. Control-A 是 `screen` 的命令键击;除非您重新绑定命令键,否则您不能使用它移动到行首。

当我在玩 . 时screen,我突然想到,虽然我问的问题是关于连接管道和 STDIN 等等,但实际上我只关心一个非常具体的情况:从 TextMate 获取文本到终端。这促使我尝试使用 AppleScript 执行此操作,令人惊讶的是,结果证明它比我尝试过的任何其他事情都更简单、更健壮。创建一个 TextMate 命令,将选定的文本或当前行作为输入,并包含

只要 MATLAB 在最前面的终端窗口中,效果就很好。(也可以搜索运行 MATLAB 的终端选项卡,为了清楚起见,我只是将其排除在外。)

这个故事的寓意是我应该问更具体的问题。再次感谢所有帮助;我从摔跤中学到了很多东西!

0 投票
1 回答
4992 浏览

c++ - c++ boost::interprocess 简单应用

我想用 boost 编写一个简单的应用程序,将字符串对象传递给其他进程。它编译得很好,但是当我尝试从第二个进程打印出字符串时,以下消息被放到控制台和第二个进程崩溃:

../boost_1_44_0/boost/interprocess/sync/posix/interprocess_recursive_mutex.hpp:107: void boost::interprocess::interprocess_recursive_mutex::unlock(): 断言 `res == 0' 失败。

第一个过程代码:

第二个过程代码:

我怎样才能使我的应用程序以正确的方式工作?

0 投票
1 回答
1443 浏览

sockets - 使用套接字进行进程间通信的限制是什么?

我正在创建一个允许在 Firefox 中使用标准 ML (SML) 作为客户端编程语言的 Firefox 扩展。它的工作方式如下:

  1. 该扩展启动一个 PolyML 进程(具有顶级交互式 shell 的 SML 编译器)。
  2. 然后在扩展和 PolyML 进程之间建立套接字通信。
  3. SML 代码从网页中读取,并通过套接字发送到 PolyML 进程进行评估。
  4. 然后,该代码可以使用我提供的库来处理 DOM。

以下是 DOM 库的实现方式:

  1. 假设有人执行一个 SML 函数 DOM.getElementById
  2. 此请求通过套接字转发到扩展,扩展在页面上执行 JavaScript 函数 getElementById 并通过套接字将结果发送回 PolyML 进程。

我的问题是,理论上,当涉及到套接字通信时,我应该期望在性能方面有什么限制?

我做了一些非常近似的分析,似乎使用扩展和 PolyML 之间的这个接口,我可以大约发送2500 个消息/秒,平均大小为70 个字节/消息

把它放在更多的上下文中,假设我想使用 Canvas 元素在浏览器中绘制一些动画。如果我想达到 20fps,这意味着我需要在 0.05 秒内绘制每一帧,这意味着我每帧只能发送大约 125 条消息。这些消息对应于 JavaScript 函数调用。例如,下面的代码绘制了一条路径并进行了 9 次 JavaScript 函数调用,对应于套接字通信中的 9 条消息。

JavaScript 显然具有更好的性能,我想你可以在这 0.05 秒内调用数千(数百)次 Canvas/DOM 函数来绘制框架。

所以,我想我的问题是,你有使用套接字通信进行非常快速的消息交换的经验吗?我想知道每秒 2500 条小消息(在这种情况下,对应于 150 KB/秒)是否正确,或者我可能做错了什么。

例如,一个怀疑是 firefox 中的套接字实现(特别是通过 JavaScript 接口https://developer.mozilla.org/en/XPCOM_Interface_Reference/nsIServerSocket使用它)对于这种快速交互不是很好。例如,从套接字读取是通过事件循环机制完成的。那就是我依靠 Firefox.. 来通知我传入套接字消息的可用性,有时在发送消息和接收消息之间会有很大的延迟(例如 250 毫秒)(尽管这似乎只在 Firefox 忙于做的时候才会发生)其他事情,我对套接字通信的..理论..限制更感兴趣)

你看到的任何想法,任何想法,任何缺陷?您是否认为使用其他 IPC 机制会更好,例如管道,从 C++ XPCOM 组件实现我的通信,而不是从 JavaScript,到 C 的外部函数接口(JavaScript 和 PolyML 都有)?

(如果有人感兴趣,该项目位于https://assembla.com/wiki/show/polymlext )

0 投票
2 回答
4001 浏览

ruby - 两个 ruby​​ 进程之间的通信是否可能/容易?

如果我有一个 ruby​​ 脚本Daemon,顾名思义,它作为守护进程运行,监视系统的某些部分并能够执行需要身份验证的命令,例如更改权限,是否有一种简单的方法来拥有第二个 ruby​​ 脚本,比如说client,与该脚本通信并向其发送命令/询问信息?我正在寻找一种内置的 ruby​​ 方式来执行此操作,我宁愿避免在这里构建自己的服务器协议。

0 投票
4 回答
1241 浏览

java - 在 Java 中使用 IO 流

我需要使用 Java 启动一个二进制文件,然后使用输入和输出流与之交互。我已经编写了一个原型来弄清楚它是如何工作的,但到目前为止我得到的唯一输出是null. 然而,当独立运行时,子程序会产生输出。我究竟做错了什么?

0 投票
1 回答
1251 浏览

java - 在 RMI 服务器中执行启动 rmiregistry 是个好主意吗?

Runtime.getRuntime().exec("start rmiregistry");放入RMI 服务器以自动启动 rmiregistry是个好主意吗?还是你们有其他建议?

0 投票
2 回答
1235 浏览

boost - 通过 boost::interprocess::message_queue 传递一个指针

我想要做的是让应用程序 A 向应用程序 B 发送指向 A 已在共享内存上分配的对象的指针(使用 boost::interprocess )。对于该指针传输,我打算使用boost::interprocess::message_queue. 显然,来自 A 的直接原始指针在 B 中无效,因此我尝试传输offset_ptr在共享内存上分配的内存。然而,这似乎也不起作用。

进程 A 这样做:

过程 B 这样做:

正如我所看到的,以这种方式对偏移量指针进行了一点复制,这使他在进程B中无效。我该怎么做呢?

0 投票
5 回答
2015 浏览

c# - 如何跨进程边界封送进程外 COM 引用?

我有一个需要密切关注的进程外 COM 服务器。该服务器作为服务运行,并且在内部是单例的。为简单起见,我称他为 BossCom。

我有另一个进程外 COM 服务器,它是一个工作者。为了系统的稳定性,它是一个一次性服务器(这意味着如果你创建 2 个 WorkerCom,则有 2 个 WorkerCom.exe 正在运行)。为简单起见,我称他为 WorkerCom。

WorkerCom 可以由任何东西启动,即使有人通过带有正确命令行参数的命令行运行它,它也可以由它自己启动。

BossCom 的总体目标是了解周围的 WorkerCom,知道他们在做什么,并能够给他们下达命令(暂停、停止、加速等)。

我最初的想法是,每当 WorkerCom 启动时,他都会 CoCreateInstance 一个 BossCom 并调用 BossCom->RegisterWorker(IUnknown me)。然后当 WorkerCom 即将关闭时,他会调用 BossCom->UnregisterWorker(IUnknown me)。BossCom 可以为 IWorkerCom 查询接口 IUnknown 并能够发出命令。

如果所有这些 com 对象都在同一个进程中,那将非常有用,但事实并非如此。我考虑过使用 GlobalInterfaceTable,但它只是在单个进程的意义上是全局的。

我花了几天时间研究这个并且不知所措。也许我是隧道式的。

如何将 com 对象的引用从 Worker 编组到 Boss?

哦,而且,不管怎样,BossCom 是用 C# 编写的,而 WorkerCom 是用 ATL C++ 编写的,但我会采用用 VB、Scala、Lisp 或任何东西编写的解决方案。我想我可以翻译核心思想。:-)