Articles of ipc

Linux相当于Windows的钩子

我想知道如何在Linux中expression一个像windows挂钩的东西。 我有一个Linux应用程序与各种线程。 当前为ctrl c安装了一个信号处理程序的主线程捕获它并closures应用程序。 我想要应用程序中的另一个线程先处理ctrl c事件,然后传递给主线程。

如何在Windows和主应用程序之间进行通信?

我试图将一个SNMP代理集成到用本地C ++编写的Windows应用程序中。 要使此代理成为Windows SNMP代理的子代理,必须编写一个用于导出由Windows SNMP服务调用的某些例程的DLL。 到目前为止事情工作正常。 现在这个DLL需要从应用程序中获取实际的信息。 我的第一个想法是让应用程序和DLL使用一个双方都可以访问的共享内存块,但这会使信息总是显得过时,并且在SNMP请求进入时运行一些代码来获取最新值会更好。双方将读写信息。 该应用程序已经有一个基于TCP的控制台界面,但连接,查询,断开连接对于来自SNMP客户端的非常频繁的请求可能有点重。 我有什么select让DLL直接与应用程序通信?

使用WaitOne命名互斥体为IPC时,是否可以使用空的while代码块?

基本上,同一个进程的多个实例将会这样做: using (var mutex = new System.Threading.Mutex(false, MUTEX_NAME)) { while (!mutex.WaitOne(100)) { /* wait to acquire mutex from other process */ } try { doSynchronizedWork(); } finally { mutex.ReleaseMutex(); } } 会有什么陷阱吗? 一个进程可以退出而不释放互斥锁? 如果发生这种情况,会抛出一个AbandonedMutexExceptionexception吗? 或者,另一个进程是否会获得互斥锁? 别的东西? 编辑: 看起来像正确的方式应该是(至less我的情况)将这样做: using (var mutex = new System.Threading.Mutex(false, MUTEX_NAME)) { bool lockObtained = false; while (!lockObtained) { try { […]

c ++快速IPC – 增强消息队列似乎很慢?

我有一个问题,我似乎无法解决自己。 我有一个在while循环中计算数据的Process1。 这个过程必须尽可能快地执行。 我需要在Process1中计算的数据以供以后分析,写入文件的速度会变慢。 我从来没有与IPC合作过,但认为这是将Process1中的数据存储在内存中的好方法,并且可以从另一个不重要的Process2(单独的程序)访问它,并将date写入文件。 我创build了我的小testing程序(了解IPC),所以: 即使Process2不可访问,Process1也会运行 – 它将跳过IPC并执行 运行Process2时,它将等待Process1 – 如果Process1启动,则获取数据,然后再写入磁盘。 Process2将只能在10个以下的采样中获取x数据量(maxRunTime)。 我创build的当前程序非常慢,在通过IPC发送消息时速度慢了6倍。 目前,我只在每个“TimeStep”传递三个浮动,但这可能是100. RunTime可能是10.000。 如果有人能指引我正确的方向,我会很高兴。 下面的代码工作,这可能是运气,因为它不漂亮。 我需要find一个尽可能快的解决scheme,但不一定是实时的。 因为我不是一个亲程序员,我还需要妥协的复杂性,因为我需要了解什么即时通讯。 希望有人能帮忙。 码: 使用Boost.1.59和MSVC 11.0_x86 两个独立的程序 – ConsoleApps 处理1: #include <boost/interprocess/ipc/message_queue.hpp> #include <boost/date_time.hpp> #include <iostream> #include <vector> #include <windows.h> #include <string> #include <ctime> #include <iostream> #include <fstream> #include <map> #include <stdio.h> #include <conio.h> #include <tchar.h> #include […]

Windows IPC模拟到Linux Unix域和Netlink套接字

在Linux上,在用户态进程和服务之间的一个相当常见的IPC方法是,例如一个套接字接口(Unix域或者netlink)。 简单地说 – 这是什么Windows的模拟,以及用户级进程如何与服务进行通信? 设置阶段:假设我有一个后台服务运行,监视networking上的设备。 如果我想写一个程序来利用这个服务提供的服务,那么这样做的常见“Windows方法”是什么? 如果我完全不在这里,那么Windows服务可能在Windows操作系统上自行扩展的常见方式是什么,以便其他进程可能知道它正在主动监听连接?

C#/ .net:报告subprocess状态到父服务

我目前有一个服务运行几个subprocess(与System.Diagnostics.Process )。 每个subprocess可以运行数小时,并处于特定的预定义状态(思考“开始”,“工作”,“清理”等 – 完全预定义,不需要报告附加到每个状态的定制数据)。 每个进程不能是一个单独的Windows服务(有比Windows服务状态更多的可能状态)。 我需要以某种方式向父服务报告这种状态。 所有进程都在同一台Windows机器上运行。 我需要能够从其他进程(不是由服务启动的那些)查询subprocess状态,并且从这些subprocess更新关于每个subprocess状态的父服务。 每个进程都有唯一的ID,所以其他进程可以轻松读取状态,而无需自己pipe理进程。 所有进程共享一个configuration文件,在这个configuration文件中,每个subprocess被分配一个唯一的ID来标识自己。 我曾经想过这样做: 将subprocess的标准输出redirect到服务( RedirectStandardOutput = true ),读取输出中的每一行并捕获“特殊”行( STATECHANGE:state ) 在状态发生变化时,将所有subprocess的状态写入预定位置的文件中,在服务出口删除该文件。 它看起来像我试图find一个解决scheme,很久以前解决了这个问题,我还没有find解决scheme。 有没有什么“好”的方式来做这样的州报告?

如何关联ETW跟踪中的RPC调用?

我logging了在Windows上执行本地RPC调用的应用程序的跟踪。 我在启用Microsoft-Windows-RPC提供程序的情况下使用了xperf。 打开跟踪之后,我意识到关联客户端和服务器调用并不那么简单。 举一个例子来解释这个问题会更容易些。 客户端发送的RpcClientCall事件之一如下所示: <Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event"> <System> <Provider Name="Microsoft-Windows-RPC" Guid="{6ad52b32-d609-4be9-ae07-ce8dae937e39}" /> <EventID>5</EventID> <Version>1</Version> <Level>4</Level> <Task>1</Task> <Opcode>1</Opcode> <Keywords>0x4000000000000000</Keywords> <TimeCreated SystemTime="2017-01-02T18:21:54.825009200+0059" /> <Correlation ActivityID="{f9ace53a-28fe-4129-ac24-8d04ea0a79a9}" /> <Execution ProcessID="10688" ThreadID="5384" ProcessorID="7" KernelTime="30" UserTime="15" /> <Channel>Microsoft-Windows-RPC/Debug</Channel> <Computer /> </System> <EventData> <Data Name="InterfaceUuid">{e60c73e6-88f9-11cf-9af1-0020af6e72f4}</Data> <Data Name="ProcNum">0x8</Data> <Data Name="Protocol"> 3</Data> <Data Name="NetworkAddress">NULL</Data> <Data Name="Endpoint">epmapper</Data> <Data Name="Options">NULL</Data> <Data Name="AuthenticationLevel"> 6</Data> <Data Name="AuthenticationService"> 20</Data> […]

服务和用户模式进程之间共享的全局事件不起作用

我试图创build一个命名的全局事件,可以在我的服务和用户进程(-es)之间共享。 用户进程可以在任何低权限login的Windows用户(即使是内置的访客)的凭据下运行。也无法知道哪个进程将首先创build该事件,即服务或用户进程。 因此,从服务和用户模式过程中,事件被创build/打开,如下所示: //Event name is made up using special/shared file path, and basically becomes something like this strEventName = L"Global\\sa_evt_C:_Users_Name_C++_Mod0110_debug_TmLog0"; //Create descriptor for "ALL access" PSECURITY_DESCRIPTOR psdAll; if(::ConvertStringSecurityDescriptorToSecurityDescriptor( isWindowsVistaOrLater ? L"D:(A;;GA;;;WD)(A;;GA;;;AN)S:(ML;;;;;S-1-16-0)" : L"D:(A;;GA;;;WD)(A;;GA;;;AN)", SDDL_REVISION_1, &psdAll, NULL)) { SECURITY_ATTRIBUTES sa; sa.nLength = sizeof(sa); sa.bInheritHandle = FALSE; sa.lpSecurityDescriptor = psdAll; hEvent = ::CreateEvent(&sa, TRUE, FALSE, strEventName); […]

IPC端口范围

IPC可以通过TCP / IP套接字完成。 在Windows下的程序之间应该使用哪个端口范围? 这与我正在使用的Windows版本有关吗? 如果我想跨平台兼容,在Linux下有什么不同? 这与我写的语言有什么关系? 如果IPC是本地的还是没有关系?

如何在Windows中结合GUI应用程序

我有一个使用Qt框架的Windows GUI应用程序(目前版本3.3.5,可能会更改为Qt4)。 我想在主应用程序中结合其他Windows GUI应用程序。 由于受到一些我无法控制的限制,我无法直接在主应用程序中使用这些小部件。 最终的布局应该是这样的: 目前我正在使用Hosting .exe应用程序中列出的方法进入对话框 。 为了传递subprocess的HWND ,我在进程之间使用我自己的IPC。 然后,我需要使用调用子窗口上的::MoveWindow Qt resizeEvent来转发resize的事件。 有没有更好或更通用的机制? 有人build议我使用ActiveX,但是我对这个技术不够熟悉。