标签: interprocess

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

我以为我会使用Boost.Interprocess的Message Queue代替套接字在一个主机内进行通信.但是在深入研究之后,似乎这个库出于某种原因避开了POSIX消息队列工具(我的Linux系统支持),而是在POSIX共享内存之上实现.界面足够相似,你可能不会立即猜测,但似乎是这样.

我的缺点是获得的共享内存shm_open(3)似乎不可用select(2),而不是通过获得的POSIX消息队列mq_open(3).

在这种情况下,Boost的图书馆似乎失败了.有谁知道为什么这应该是?即使POSIX消息队列仅在某些系统上可用,我也希望Boost在可用的情况下使用该设施,并且只在必要时重新实现它.POSIX系统是否存在一些我尚未认识到的陷阱?

select boost epoll message-queue interprocess

8
推荐指数
1
解决办法
5376
查看次数

文件锁定与信号量

出于好奇,在Linux上实现进程间同步的首选方法是什么?该sem*(2)系统调用的家人似乎有一个非常笨重,过时的接口,同时有三种方式来锁定文件- fcntl(),flock()lockf().

有什么内部差异(如果有的话)以及你如何证明每种差异的使用?

c unix linux interprocess

8
推荐指数
2
解决办法
9363
查看次数

提升了named_mutex和remove()命令

我有一个可以由多个线程创建的类.但是在一个函数中需要保护代码,所以我决定使用boost interprocess互斥.每个类在其构造函数中创建或打开相同的Mutex:

MyClass::MyClass()
{
       boost::interprocess::named_mutex m_Lock(
                 boost::interprocess::open_or_create, "myLock" );
}
Run Code Online (Sandbox Code Playgroud)

所以现在有一个关键代码部分被调用的地方:

int MyClass::MyFunction()
{
       boost::interprocess::scoped_lock<boost::interprocess::named_mutex> lock(
                  m_Lock, boost::interprocess::try_to_lock);
       if(!lock)
       {
           return -1;
       }
       // else do some stuff here 
}
Run Code Online (Sandbox Code Playgroud)

要在函数后清理(和它在boost页面上描述的那样),我在我的类析构函数中使用remove命令:

MyClass::~MyClass()
{
       boost::interprocess::named_mutex::remove("myLock");
}
Run Code Online (Sandbox Code Playgroud)

实际上所有这些代码都运行良好,但我有一个问题:

正如在remove命令的描述中所说:

从系统中删除命名的互斥锁.错误时返回false.永远不要扔.

所以这意味着删除命令只是将Mutex清除出系统 - 即使另一个线程刚刚锁定它(我已经尝试过这种情况 - 它已经不再被锁定了).所以我的问题如下:例如我有3个线程(A,B和C) - 现在发生以下情况:

  1. 进程A创建类的实例,调用函数并锁定它
  2. 进程B创建类的实例,调用函数但无法访问代码(然后等待例如)
  3. 进程A完成受保护的代码并解锁
  4. 进程B获得对受保护代码的访问权并锁定它
  5. 进程A删除类的实例 - >调用remove命令
  6. 进程C创建类的实例,调用函数并可以访问代码,因为remove命令删除了Mutex - > Error!

所以现在有人可能会说"那就不要打电话了!" - 那可能吗?我的意思是,因为named_mutex写入系统,我怀疑它是否在没有显式调用的情况下被删除,即使程序结束.有人帮忙吗?

c++ boost mutex locking interprocess

8
推荐指数
1
解决办法
5360
查看次数

锁定两个进程而不是线程的自由/原子操作

我通过使用共享内存在多​​个进程之间共享一些数据; 我使用进程间互斥来实现同步.

我的问题如下:是否可以使用无锁数据结构和/或原子操作来实现更快的同步,而无需在两个进程之间使用互斥锁?

如果不是,你知道这是什么主要原因?

它们仅用于同步同一进程的线程.这些概念是否也可以移植到流程中?如果不是,您是否知道跨进程共享/同步数据的更快方法?

c++ linux ipc lock-free interprocess

8
推荐指数
1
解决办法
1919
查看次数

在WPF或Console C#app中接收WM_COPYDATA结构

我正在编写一个C#应用程序,需要与用本机C编写的另一个应用程序进行通信.到目前为止,我已经想出如何使用User32.dll SendMessage将消息从我的C#应用​​程序发送到C应用程序.但是,我无法弄清楚如何让C#应用程序从C应用程序接收消息.

我已经看到了覆盖WndProc方法的WinForms示例,但是在WPF或Console应用程序中没有要覆盖的WndProc方法.当然,至少可以在控制台应用程序中执行此操作.对?

c# wpf console interop interprocess

7
推荐指数
1
解决办法
3531
查看次数

匿名段上的boost :: interprocess内存分配器

我正在尝试使用类似mmap的段来分配stl容器上的对象,因为我正在使用boost :: interprocess,它提供了内存映射,分配器和匿名内存映射支持.
有点像这样

我的问题是这里anonymous_shared_memory函数返回的内容看起来是半映射文件和半共享内存(对mmap有意义))虽然这两种样式都与进程间分配器一起使用,但这个样子看起来像缺少一个执行实际块分配的segment_manager. 因为它返回一个已经映射到进程中的高级别,但没有经理,也没有办法让我看到挂钩.
mapped_regionsegment_manager

c++ linux boost multiprocessing interprocess

7
推荐指数
1
解决办法
815
查看次数

将数据从C进程传递到C++进程

这是我第一次在这里发帖提问,我通常会在档案中找到答案,但这次我很难过.

我使用来自使用Windows Driver Kit的供应商的一些代码从操纵杆中获取数据.数据采用具有6个元素的数组形式(它是6个自由度的鼠标).

我已经编写了需要抓取数据的代码,而且它是用C++编写的......它使用标准库很多用向量而不是.似乎使用WDK的标准库是一个很大的痛苦,我花了几天试图上班但失败了.我的下一个想法是使用boost :: interprocess,但由于同样的原因,这很难与WDK一起使用.

我想知道是否有办法在C进程和C++进程之间共享内存.我想使用C程序将数组写入内存并从C++程序中读取.它需要发生得非常快,应该有一种方法可以确保我不会在写入(mutex?)中读取它.

欢迎任何想法或建议.

编辑 我做了一个DLL,现在我只有一个DLL,它有一个getValues()函数,我可以从我的C++项目调用.我不得不使用pimpl成语来隐藏c的东西.谢谢你的帮助!

c c++ shared-memory interprocess

7
推荐指数
1
解决办法
324
查看次数

Node.js的进程间事件发射器?

目前,我在我的应用程序中使用EventEmitter2作为消息总线,我真的很喜欢它.

无论如何,现在我需要一个消息总线,它不仅可以在进程中工作,还可以在进程间工作.我理想的候选人会......

  • ...与EventEmitter2 API兼容("直接替换"),
  • ...在没有专用服务器或外部服务(例如数据库,消息队列......)的情况下工作,仅使用OS资源,
  • ...用纯JavaScript编写,
  • ...在内存中运行,因此它不需要持久性.

我该怎么办没有需要:

  • 它不需要在Windows上运行,OS X和Linux都可以.
  • 如果它只在一台机器上工作就没关系,它不需要具备网络意识.

任何想法或提示?

PS:如果你可以推荐一款可用的产品,这很好,但是如果你可以指引我自己做一个无服务器的方向,也没关系.

ipc message-queue interprocess node.js

7
推荐指数
1
解决办法
7981
查看次数

在Mac OS X中相当于Windows的名为mutex?

目前我正在使用C++将软件从Windows移植到Mac OS X.

在Windows中,全局名为mutex的状态为废弃状态,这意味着互斥锁的当前所有者进程在不释放互斥锁的情况下消失.(这可能是由应用程序崩溃引起的)

由于存在废弃状态,试图锁定被遗弃的互斥锁不会造成死锁.
如果没有废弃的状态,它将永远等待不属于任何人的互斥锁.

还有另一种方法是使用超时来假设如果无法在一定时间内获得互斥锁而放弃互斥锁,但与废弃的互斥方式相比,它并不是一个完美的解决方案.在最坏的情况下,意外地两个进程可以访问由互斥锁锁定的对象.

在Mac OS X/Linux中是否有任何互斥支持被放弃的状态?

我研究了boost库,boost库有一个名为mutex,但是那个基于共享文件,所以它没有放弃状态.

请给我一些建议.

c++ linux macos mutex interprocess

7
推荐指数
1
解决办法
2455
查看次数

如何在C#中正确使用命名管道 - 多个连接,服务器娱乐等

我需要在C#应用程序之间实现进程间通信.我决定使用命名管道并编写以下代码:

服务器

while (true)
{
    using (var server = new NamedPipeServerStream("some_pipe"))
    {
        server.WaitForConnection();
        using (var reader = new StreamReader(server))
        {
            string line = reader.ReadLine();
            MessageBox.Show(line);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

客户

using (var client = new NamedPipeClientStream("some_pipe"))
{
    client.Connect();

    using (var writer = new StreamWriter(client))
    {
        writer.AutoFlush = true;
        writer.WriteLine(path);
        client.WaitForPipeDrain();
    }
}
Run Code Online (Sandbox Code Playgroud)

我有以下问题:

  • 这个解决方案是否正确?您是否已经看到任何问题或错误?
  • 如果第二个客户端将尝试连接到此服务器,会发生什么?是否会等待第一个客户端完成或只是将其消息与另一个客户端的实例一起发送导致垃圾?
  • 我应该NamedPipeServerStream每次都真正创建另一个类实例吗?如果我从while (true)循环移动它的结构,它给我一个例外"无法访问一个封闭的管道".我怎么能避免呢?如果我无法避免它并且每次都应该重新创建这个对象,那么NamedPipeServerStream当客户端尝试连接它时会发生什么?

c# named-pipes interprocess

7
推荐指数
1
解决办法
9461
查看次数