Haskell Win32等同于“单实例应用程序”中的CreateMutex和COPYDATASTRUCT?

时间:2012-07-15 13:34:08

标签: winapi haskell

我目前使用以下资源轻量级“非托管”Windows C ++应用程序:

  • CreateMutex以确保最多只有一个应用程序实例。

  • COPYDATASTRUCT将命令行参数传递给该单个实例,如果另一个实例尝试启动(在发送数据之后,它将退出)。

用例很简单:启动一个新的应用程序实例来打开命令行中指定的文件,或以其他方式在先前启动的应用程序实例中打开该文件。

如何在Haskell程序中实现相同的行为?

1 个答案:

答案 0 :(得分:0)

GHC附带的Win32 package似乎没有提供CreateMutex。您需要使用FFI自行绑定它或以跨平台方式模拟它。 Linux上常用的一个技巧是选择一个特定的文件名作为“互斥体”;如果它不存在,则创建它并记下如何联系您,然后在退出时将其删除,如果是,则从中读取联系信息以了解如何连接到已经运行的进程。这种方法确实有缺点:如果您的应用程序或整个计算机出现故障,您将收到陈旧的联系信息。

对于IPC,我认为有许多跨平台接口。 Wikipedia有一个很好的清单;特别适合在Haskell中执行此任务的是sockets(named) pipesdbus。对于后两者,您可能需要Cygwin,因为它们最终依赖于安装unix包。