问题标签 [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 投票
4 回答
964 浏览

cocoa - 如何在另一个程序的窗口上发布可可“工作表”?

使用 Apple OS X Cocoa 框架,如何在另一个进程的窗口上发布工作(向下滑动模式对话框)?

编辑:澄清一点:

我的应用程序是一个 Finder 扩展,用于进行 Subversion 版本控制 ( http://scplugin.tigris.org/ )。我的应用程序的一部分是插件(Finder 的上下文菜单项);然而,我的大部分应用程序都在一个单独的守护进程中。出于几个原因,我们选择将几乎所有代码都放入守护进程;该插件只定义了菜单本身,并将 Apple-Events 交给了守护进程。

有时,守护程序需要提示用户提供更多信息。它可以为此在屏幕上抛出一个窗口,但这是破坏性的(随机定位),在我看来,这里的工作流程是合法的模式,例如“选择一个文件,从菜单中选择‘提交’,提供提交评论,做手术。”

进程间合作(例如传递某种引用)是可以接受的:两个进程都是我的,但我想避免将工作表的代码绑定到主进程中。

0 投票
2 回答
5595 浏览

select - Boost Message Queue 不是基于 POSIX 消息队列?无法选择(2)?

我想我会使用 Boost.Interprocess 的消息队列代替套接字在一个主机内进行通信。但是在深入研究之后,似乎这个库出于某种原因避开了 POSIX 消息队列工具(我的 Linux 系统支持),而是在 POSIX 共享内存之上实现。界面非常相似,您可能不会马上猜到,但似乎确实如此。

对我来说不利的是,shm_open(3)select(2)通过mq_open(3).

在这种情况下,Boost 的库似乎丢失了。有谁知道为什么会这样?即使 POSIX 消息队列仅在某些系统上可用,我希望 Boost 在可用的地方使用该工具,并仅在必要时重新实现它。POSIX 系统是否存在一些我还不认识的缺陷?

0 投票
2 回答
2195 浏览

boost - boost::Windows 服务和用户应用程序之间的进程间

我正在使用 boost::interprocess 在两个应用程序之间进行通信。当两个应用程序由同一个用户启动时,效果很好。

当其中一个应用程序是服务时,它会失败。

我发现共享媒体实际上是在“TMP”目录中创建的文件。所以它失败了,因为每个应用程序都在他自己的“TMP”目录中创建自己的文件。

也许我没有将它用于我的特定目的的好方法。

有人知道如何解决我的问题吗?

非常感谢,

网卡


编辑:我尝试使用“ managed_mapped_file ”。我的问题是 win32 实现正在调用“ CreateFileMapping ”而没有指定对象的名称。在我的特殊情况下,我认为我需要指定类似“ Global\MyMappedFile ”的内容,以便应用程序和服务都可以查看映射文件。

0 投票
2 回答
1304 浏览

air - 如何从 C 程序将 AIR 运行时加载为进程内共享库

我想按照 java.exe 的方式用 C 语言构建一个特殊的 AIR 启动程序。

我用进程查看器查看了运行 AIR 程序,并且能够找到正在使用的 AIR 运行时 DLL。AIR 程序与 Java 的不同之处在于,它们作为特定于平台的可执行文件安装,一旦启动,它们就会将 AIR 运行时绑定为进程内共享库(用户双击它们的图标)。

好吧,我想制作一个类似于 java.exe 的 AIR 启动器。

java.exe 作为平台操作系统进程启动,它作为进程内共享库绑定到 Java JVM 运行时 (JRE)。要执行的 java 应用程序被指定为 java.exe 的命令行参数。一旦 java.exe 运行并且 JVM 完全正常运行,指定的 java 应用程序类将由 JVM 类加载器加载以执行。然后,指定的 Java 应用程序接管,在某种意义上“劫持”了 java.exe 的进程。当然,指定的 java 应用程序会在任何进程列表中显示为托管它的 java.exe 程序。

我想让 AIR 应用程序启动像这样工作。为什么?所以我可以探索破解 AIR 的方法,也许可以克服它的许多缺陷。例如,对于初学者,我想通过一些新的 API 来扩展 AIR 运行时体验,这些 API 可用于正在运行的 AIR 应用程序。

我的首要任务是:

  • 实现与 .NET PInvoke 相当的 ActionScript3 到 C 的绑定接口
  • 添加一个用于启动进程的 API,该 API 与 Java SE 中的 API 相当(Runtime.exec、ProcessBuilder、Process)
  • 添加对 AIR 应用程序的支持,以便能够与 stdin、stdout、stderr 交互。奇怪的是,尽管 Adob​​e 在 AIR 中添加了对本地文件访问的支持,但它们却省略了与这些标准文件管道的交互(但它们可以在 AIR 支持的任何操作系统平台上找到)。
  • 通过 stdin、stdout、stderr 实现对 AMF 的支持——因此 AIR(或 Java 或任何支持 AMF 的语言)应用程序可以通过交换 AMF 对象来进行通信。这将为 AIR 添加一点微软的 PowerShell。

目前 Merapi 提供了一个带有 Java 的 AMF 桥接器,从而证明了它的功效。唉,Merapi 必须使用 localhost 端口和套接字来进行进程间通信——相对于使用 stdin/stdout/stderr 进程间管道,这是一种笨拙的方式。

0 投票
6 回答
3555 浏览

c++ - Windows x64 上 32 位和 64 位应用程序之间的进程间通信

我们希望支持一些最近停产的硬件。硬件驱动程序是一个普通的 32 位 C DLL。我们没有源代码,并且(出于法律原因)对驱动程序的反编译或逆向工程不感兴趣。

硬件快速发送大量数据,因此通信协议需要非常高效。

我们的软件是本机 64 位 C++ 应用程序,但我们希望通过 32 位进程访问硬件。什么是 32 位和 64 位应用程序相互通信的高效、优雅的方式(理想情况下,不涉及发明新协议)?

解决方案应该在 C/C++ 中。

更新:一些受访者要求澄清这是用户模式还是内核模式驱动程序。幸运的是,它是一个用户模式驱动程序。

0 投票
1 回答
6538 浏览

c - 在 C 中使用管道进行父子 IPC 会导致程序阻塞

我正在编写一个服务器,当它接受套接字连接时,fork() 会关闭子进程。

当孩子与客户沟通时,它必须将一些信息发送回父母。我正在使用管道来完成此操作。

问题是,当我尝试执行父子 IPC 时,父在读取子输入时会阻塞。这意味着,即使子进程同时运行,它们也只能一次处理一个,因为它们都在等待父进程。

我的代码看起来像这样(为简洁起见,删除了错误检查):

所以我的问题是,我该如何解决这个问题?我怎样才能让父母使用管道与孩子进行交流,而不会阻塞?

这甚至可以通过管道实现,还是我应该使用共享内存(我猜是信号量)或消息队列?(我读过这篇文章:比较 Unix/Linux IPC,但很难找到这些任务是如何实际完成的示例。)

更多细节:

我有一个执行以下操作的测试程序: 1. 连接到服务器 2. Sleep(5) 3. 断开与服务器的连接

当我运行该程序的 2 个实例时,服务器会输出以下内容:

显然一次处理每个客户。

当我删除 IPC - 当我从父子节点中删除管道 read() 和 write() 时,我得到了这个:

这就是我想要的!

关于我如何做到这一点的任何想法?(或者我应该在解决这个问题的方式上做出改变?)

(编辑:这是网络课程作业的一部分。我们正在实现一个 P2P 协议,该协议使用中央服务器来管理对等点。我们可以使用任何语言,我想我会在 C 中试一试。)

0 投票
2 回答
1313 浏览

c++ - 在 boost::vector 和 boost::matrix 中动态改变分配策略

在我的新项目中,我正在构建一个数据管理模块。我想为上层提供一个简单的模板存储类型,例如

我的目标是,用一些不同的分配器更改数据分配器,例如 Boost.inter 进程分配器或 Boost.pool 分配器(Boost Ublas 矩阵和向量类将分配器作为模板参数)。并且只提供一个类和工厂方法来创建适当的分配器。虚拟基类可能很甜蜜,但我无法处理如何将它与模板一起使用。你们提供什么样的设计模式或解决方案?

编辑:

我将使用 boost.pool 和 boost.shared_memory_allocator。简而言之,我想拥有具有不同分配策略的不同类。但我的观点是程序的上层部分应该对此一无所知。对我来说真正的挑战是收集不同的模板类相同的基类。

编辑:对于想要将矩阵类与自定义分配器一起使用的人。

是这样的:

0 投票
3 回答
315 浏览

c++ - 在 Windows XP 中多次启动程序 + DLL 的问题?

我们开发了一个使用 TCP 和 UDP 套接字的网络库。此 DLL 由 testclient 使用,该客户端在同一台 PC 上多次启动以进行负载测试。

在 Windows Vista 中,多次启动 testclient 是没有问题的。在 Windows XP 中,启动它最多 5 次是没有问题的,但是如果我们启动它 6 次或更多,然后关闭一个客户端,它们都会崩溃并带有明显的随机堆栈跟踪。

是的,虽然我们不使用任何进程间代码(仅客户端之间的套接字),但其中一个客户端的终止会导致所有客户端的崩溃。

我们的 DLL 使用 MSVC 编译并使用 Boost 和 Crypto++ 库(静态链接)。

知道为什么不同的过程会相互影响吗?

0 投票
5 回答
302 浏览

tcp - 哪种方法更适合在两个进程之间发送图像流,本地 TCP/IP 连接或进程间通信?

假设我必须复制流中的每个图像(我不能简单地使用任何互斥保护访问该数据,无论如何都必须复制它),哪种方法更好,优点/缺点?

我还想知道与在同一过程中使用图像相比,这意味着多少性能损失。

谢谢

0 投票
2 回答
7677 浏览

c++ - Boost、共享内存和向量

我需要在进程之间共享一堆字符串(将来可能会更复杂的对象)。我决定使用 boost::interprocess 但我无法让它工作。我确定这是因为我不理解某些东西。我遵循了他们的示例,但是如果有使用该库经验的人可以查看我的代码并告诉我出了什么问题,我将不胜感激。问题是它似乎可以工作,但是经过几次迭代后,我在阅读器进程和有时在编写器进程上都遇到了各种异常。这是我的实现的简化版本:

编辑编辑使用named_mutex。原始代码使用了不正确的 interprocess_mutex,但这不是问题。

EDIT2我还应该注意,事情在一定程度上起作用。writer 进程可以在 reader 中断之前推送几个小字符串(或一个非常大的字符串)。阅读器以 m_stack->begin() 行不引用有效字符串的方式中断。是垃圾。然后进一步执行会引发异常。

EDIT3我已经修改了类以使用 boost::interprocess::string 而不是 std::string。阅读器仍然失败,内存地址无效。这是读者/作者