问题标签 [inter-process-communicat]

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 回答
23552 浏览

c# - 如何通过进程 ID 而不是窗口句柄向特定进程发送消息?

为了解决 GenerateConsoleCtrlEvent 的限制,我必须创建一个中间“中间人”进程来处理启动一些控制台应用程序。该进程的主要目的是在其自身上调用 GenerateConsoleCtrlEvent,导致自身和所有子进程干净地关闭以响应 ctrl+break 信号(而不是使用 Process.Kill)。这种需求源于 GenerateConsoelCtrlEvent 基本上没有效果,除非进程组 id 为零,这意味着它只对调用进程组本身有效。请参阅:https ://stackoverflow.com/a/2431295/88409

所以无论如何......我已经创建了这个中间进程,它启动了一个线程,该线程在处理特定用户定义消息的表单上调用 Application.Run。

我的问题是......如何向这个进程发送消息来控制它?

我有 Process 对象及其进程 ID,仅此而已。Process.MainWindowHandle 为零。

所以我需要一种向特定进程发送消息或将消息广播到特定进程中的所有窗口的方法。

FindWindow 不是一个选项,因为它试图在任何进程上通过名称和类来识别窗口,这是不可靠的。我想毫无歧义地向特定进程发送消息。

0 投票
3 回答
38841 浏览

python - 两个python脚本之间的通信

方法论问题:

我有一个“主”python 脚本,它在我的系统上的无限循环上运行,我想偶尔使用其他一些 python 脚本向它发送信息(例如,json 数据字符串),这些脚本稍后将由我自己或其他程序启动并将在发送字符串后结束。

我不能在这里使用子进程,因为我的主脚本不知道另一个脚本何时运行以及它们将执行什么代码。

我正在考虑让主脚本在本地端口上侦听并让其他脚本在该端口上发送字符串,但是有更好的方法吗?

0 投票
1 回答
2034 浏览

vhdl - VHDL中进程之间的通信

我在进程之间进行通信时遇到问题。我曾经使用 flag 和 clearFlag 来解决这个问题,但这有点烦人而且看起来不太好。处理此问题的最佳做法是什么?这是我之前如何做的示例代码:

这种方法有效,但我认为这不是很好的方法。我必须写一个标志和 clrFlag 夫妇来完成这项任务。我想要做的就是当事情发生时(例如A <= in;),它会触发另一个proc,例如Proc_B,运行一次或多次。这个问题的最佳实践是什么?谢谢!

0 投票
1 回答
457 浏览

c++ - C++ 管道/ReadFile lpNumberOfBytesRead/DLL

我似乎在我的 c# 应用程序和 c++ 应用程序之间创建管道时遇到了问题。我的 c++ 应用程序是一个 dll,它被注入到某个程序中,并为我的 c# 应用程序打开了一个管道。

我的问题?在 ReadFile lpNumberOfBytesRead (cbRead) 中总是返回 0

代码:

0 投票
1 回答
615 浏览

c - 如何将套接字控制传递给子进程?

我编写了一个小型代理服务器,它侦听端口 25 并执行一些操作。

在安全 SMTP 的情况下,我派生一个进程并让子进程接管此会话。

思考过程是这个子进程应该是满足特定客户请求的子进程。如果有另一个客户端发送邮件(安全),那么我需要分叉另一个进程。

但是发生的事情是,一旦子进程处理了客户端请求,它就会继续侦听,但不迎合这个客户端。父进程已经在监听这个套接字,所以每次都派生一个新进程。

我该如何处理这种情况?如果已经为客户端(IP 地址)分叉了一个进程,则不应发生新的分叉。现有的子进程应该处理这些请求。

该程序基于 C 语言并在 linux 上运行。

0 投票
2 回答
155 浏览

c++ - 仅使用本机 C++ 操作为多个进程创建共享内存?

如何仅使用本机 C++ 操作分配可从多个进程访问的共享内存?或者我应该像在互斥锁和信号量等线程间同步对象的情况下那样使用我的操作系统 API?(我的意思是你不能使用 bool 代替 mutex。操作系统有特定的类型来组织同步。)

0 投票
1 回答
414 浏览

c# - C# 中的快速分布式内存访问

我有一个 C# WCF 服务,它托管 120 GB 的内存,Dictionary<File,byte[]>可以非常快速地访问文件内容,这对我来说真的很好用。访问后,文件内容被包装在 MemoryStream 中并读取

该服务需要每天重新启动,以从数据库中加载一些每天都可能发生变化的静态数据。由于需要再次将大量数据加载到内存中,重新启动花费了很多时间

所以我决定在同一台机器上的不同进程中托管这个内存,并通过套接字访问它。数据进程将始终启动并运行。TcpListener/Client 和 NetworkStream 的使用方式与以下类似

问题是:这比在同一进程中托管内存要慢 10 倍。预计会放缓,但 10 倍太多了。

我想到了 MemoryMappedFiles,但它们对于随机访问文件的特定视图更有用。我的文件访问从头到尾都是连续的。

在我的情况下是否可以使用不同的技术或库?或者这只是如此预期?

0 投票
1 回答
128 浏览

c# - 使用文件在两个进程之间交换消息

我正在创建一个使用Microsoft.Office.Interop.Excel 命名空间将数据输出到 excel 的 C# 程序

在 excel 中,我有 5 个用户定义函数 (UDF),在执行时我想在我的 C# 应用程序上调用一个方法。我计划在 C# 上触发方法的方式是在 excel 上,我将写入一个名为someFile.txtI will write 1to it 的文件。然后在我的 C# 应用程序上,我会读到它1,因为我读到了 1,所以我会触发方法 1。一个进程(excel)将写入该文件,而另一个进程(c# 程序)将从该文件中读取。换句话说https://stackoverflow.com/a/222111/637142

我知道创建 XLL 或使用命名管道会更合适。问题是我对 Visual Basic 知之甚少,我相信将一个字节写入文件(1、2、3、4 或 5)应该很快。那么使用这个实现是一个坏主意吗?

0 投票
3 回答
2263 浏览

c# - 向其他进程发送消息

我希望能够在服务器应用程序和客户端应用程序之间进行通信。这两个应用程序都是用 C#/WPF 编写的。接口位于一个单独的 DLL 中,两个应用程序都引用它。

在 interface-dll 中是 IDataInfo-Interface,它看起来像:

服务器应用程序通过以下代码调用客户端:

客户端应用程序通过以下方式从服务器获取消息:

Serializer-Class 只是一个通用类,它使用 Soap-Formatter 来序列化/反序列化。代码如下所示:

直到这里一切正常。服务器创建客户端,客户端可以将它的参数反序列化到IDataInfo-Object。

现在我希望能够从服务器向正在运行的客户端发送消息。我用方法在Interface-DLL中引入了IClient-Interfacevoid ReceiveMessage(string message);

MainWindow.xaml.cs 正在实现 IClient 接口。

我现在的问题是,当我只有 Process-Object 时,如何在我的服务器中获取 IClient-Object。我想过Activator.CreateInstance,但我不知道如何做到这一点。我很确定我可以通过进程的句柄获得 IClient,但我不知道如何。

任何想法?

0 投票
2 回答
619 浏览

c# - 使用可以由不同进程直接读取而无需复制开销的共享内存的最佳方式

我有一个应用程序,其中初始化涉及从文件(〜> 10 GB)中读取非常大的数据,然后对这些数据(类型为Dictionary)执行一些计算。即使我的数据是固定的/从未更改过,初始化步骤每次都需要几个小时。我想做的是以某种方式使用一个进程将这些数据预加载到内存中,并在同一台机器上的另一个进程直接从其中读取所有数据一次,并且没有任何 COPY。到目前为止,我已经找到了几种方法:

  • .Net 远程处理远程对象。然而,这种方法承担了编组成本,因此不适用于我的情况,因为数据传输会在某一时刻产生两倍的内存。

  • 内存映射文件。这个选项似乎仍然需要数据复制,就我而言,它并不理想,因为我需要复制所有 >10GB 的数据。我发现了一些关于使用不安全访问内存地址的文章,但我不完全知道它是如何工作的。

  • WCF 命名管道。这种方法似乎类似于远程处理,并且仍然需要数据传输。

我的方案最有效的方法是什么?