Articles of ipc

我可以通过使用内存映射文件的指针吗?

我已阅读关于内存映射文件的文章和有关CreateFileMapping的示例。 我的问题是:我可以传递一个指针结构或两个进程之间使用内存映射文件的对象? 由于有一些答案,这是可能的,这里是我想通过的结构: // First Process struct OtherStruct{}; struct MyStruct { unsigned long handleObject; unsigned long *phandleObject; OtherStruct someData; OtherStruct *pData; } MyStruct dataSend = { … }; WriteToMappedFile(data); // Second Process MyStruct dataReceived = ReadFromMappedFile()

如何保护两个进程之间共享内存中的string?

我有一个共享内存中包含一个string和两个进程之间的整数。 进程A写入,进程B读取(反之亦然) 什么是最有效和最有效的方法来确保进程A不会更新(写入),同时进程B正在读取它? (我应该只使用共享内存中的标志,使用信号量,关键部分….) 如果你能指出我正确的方向,我将不胜感激。 谢谢。 Windows,C ++

我如何连接两个应用程序

我正在考虑在C ++中构build一个应用程序,该应用程序将parsing来自Web的文本并创build一些统计结果。 这些结果我想实时在外部应用程序中喂食。 外部应用程序(我的代码无法访问,但可以要求付费 – 自定义添加)然后需要一些代码来读取和使用这些结果。 我想知道在速度和易用性方面,将两个应用程序互连的最佳方式是什么。 我正在考虑 : disk I/O (slow) a Windows service a DLL a web service a web page 也许我错过了一个更好的解决scheme? 谢谢。 Update : there is an additional need to know how long a data request may take at worst.

对等到多对等进程间通信

在Windows中,对等到多对等进程间通信的最佳方法是什么? (一个应用程序会将中断发送给许多监听器)我脑海中想到的一个方法是使用带有HWND_BROADCAST参数的SendMessage。 我还能做什么?

如何等待用户进程的系统进程?

我有一个.net Windows服务作为本地系统运行。 我有另一个.net进程,需要等待服务终止。 该进程不知道服务名称,因此无法查询服务控制pipe理器。 它确实知道服务进程ID。 我可以修改Windows服务和其他进程的来源。 当我做: process = Process.GetProcessById(processId); process.WaitForExit(); 从另一个过程中,我得到: System.ComponentModel.Win32Exception: Access is denied Stack trace: at System.Diagnostics.Process.GetProcessHandle(Int32 access, Boolean throwIfExited) at System.Diagnostics.Process.WaitForExit(Int32 milliseconds) GetProcessHandle调用OpenProcess 。 显然,目标进程应该允许上述SYNCHRONIZE位工作,理论上可以通过Windows服务中的SetSecurityInfo来设置。 但是,似乎没有一个简单的方法来做到这一点在短短几个pinvokes升级,启用特权,最后改变安全。 我忽略了从用户进程中等待另一个(系统)进程的简单方法吗?

Win32:基于date的唯一增量ID的同步

在单个Windows框中生成唯一递增的整数ID是简单而高效的:共享内存, InterlockedIncrement() ,故事结束。 当id大于一个整数和/或更复杂时,情况会变得更复杂。 由于历史/连续性原因,networking服务的一部分每天需要唯一的递增ID(计数器),date和计数器是整数。 这一天是基于请求到达前端服务器的时间,而ID则是由各个工作进程生成的。 这意味着对新id的请求可能不按顺序发生:昨天的id可以在今天的第一个id已经被分配之后被请求。 在一个互斥体中包含两个计数器(一个用于奇数日,另一个用于evens)解决了这个问题,所以这就是我要做的生产。 然而,情况特别在于,id的一天保证只能每24小时更换一次,也就是说,一个简单的共享整数的InterlockedIncrement()就足够了超过99.999%的时间。 因此,我想知道为了纯粹的教育目的,更贴近的解决scheme是什么样的。 下面是我提出的一些伪代码: SomeMutex id_mutex; DayBasedId counters[2]; // shared memory counter records for odd and even days // … int get_new_id (int today) { DayBasedId *counter = counters + (julian_day_number(today) & 1); if (InterlockedCompareExchange(&counter->day, 0, 0) != today) { acquire(id_mutex); if (counter->day != today) { counter->day = […]

networking的机器代码是什么样的?

在这一天结束的时候,我们写的每一段代码最终都变成了汇编程序,然后是机器语言。 如果你正在编写汇编程序并想在两台计算机之间执行一个简单的连接,你怎么知道汇编程序中要使用哪个内存地址(更不用说偏移量了)? 你需要知道有关操作系统的具体地址? 我只是想知道如何有人会写一个真正的“干净”,“高效”的消息传递库/编译器 – 得到我的东西是networking通信/ IPC在汇编程序中看起来像什么? 我想这个答案的一部分可能在于查询有关操作系统的已知地址? 例如,0x4545456到0x60000000包含用于通信X等的Linux内核数据

是否有可能与另一个进程共享一个现有的内存块?

背景 我有一个现有的32位应用程序有一个相当大的内存(> 128 MB)的大块分配(通过malloc /新),并填充一些图像数据(多帧价值)。 通过SDK-API调用,应用程序的插件可以访问该块RAM的起始处的只读指针(const char *)。 其他API调用可用于检索元数据,如宽度/高度/位深度等。 在SDK-API调用之外,我没有/很less控制这个应用程序。 我有另一个64位应用程序(在我的控制下),需要上述数据作为input,并需要更多的RAM,由于上采样/ 3D体积重构,保证64位进程。 问题 我希望通过64位进程共享映射到32位进程(最初不是通过CreateFileMapping / MapViewOfFile调用,而是通过malloc / new运算符调用)创build的映射到此现有指针的物理内存。 这甚至有可能吗? 通常,我会在32位进程中创build一个相同大小的共享内存,复制内容并使用一些同步方法来表示数据可用。 然而,在我的情况下,32位的进程也挤满了许多插件,因此它非常接近可用的免费虚拟空间的限制。 由于内存碎片,MapViewOfFile可能会失败。 由于我只需要一个只读块的副本,我试图避免额外的分配和复制。 我的目标是64位Windows 7,Visual C ++ 2010/2015

Windows URLscheme调用正在运行的程序

我想要在正在运行的应用程序中触发事件,并在Windows 10中调用URLscheme来传递参数。我做了以下registry项: HKEY_CLASSES_ROOT alert (Default) = "URL:Alert Protocol" URL Protocol = "" DefaultIcon (Default) = "alert.exe,1" shell open command (Default) = "C:\Program Files\Alert\alert.exe" "%1" 显然,当调用“alert:arg1”时,这总是会启动带有参数的应用程序的新实例。 但是我想让Windows调用我已经运行的实例。 使用Mac,这个URLscheme的调用会触发一个事件,我可以理解。 正好如我所愿。 为此,我将以下部分添加到alert.app/Contents/Info.plist: <array> <dict> <key>CFBundleURLName</key> <string>Alert</string> <key>CFBundleURLSchemes</key> <array> <string>alert</string> </array> </dict> </array> 那么如何在Windows上实现这一点呢? 我正在使用面向对象的BASIC在XOJO中编写这个应用程序,但是我会很乐意提供一个通用的解决scheme。

在2个C程序之间传输数据最简单的方法是什么?

在Windows上的ANSI C中,在本地运行的两个程序之间传输数据的最佳/最简单的方式是什么,而不需要从文件读/写? 数据将是基本的文本,只有一个程序将被发送,另一个接收。 谢谢。