我目前使用以下资源轻量级“非托管”Windows C ++应用程序:
CreateMutex
以确保最多只有一个应用程序实例。
COPYDATASTRUCT
将命令行参数传递给该单个实例,如果另一个实例尝试启动(在发送数据之后,它将退出)。
用例很简单:启动一个新的应用程序实例来打开命令行中指定的文件,或以其他方式在先前启动的应用程序实例中打开该文件。
如何在Haskell程序中实现相同的行为?
答案 0 :(得分:0)
GHC附带的Win32
package似乎没有提供CreateMutex
。您需要使用FFI自行绑定它或以跨平台方式模拟它。 Linux上常用的一个技巧是选择一个特定的文件名作为“互斥体”;如果它不存在,则创建它并记下如何联系您,然后在退出时将其删除,如果是,则从中读取联系信息以了解如何连接到已经运行的进程。这种方法确实有缺点:如果您的应用程序或整个计算机出现故障,您将收到陈旧的联系信息。
对于IPC,我认为有许多跨平台接口。 Wikipedia有一个很好的清单;特别适合在Haskell中执行此任务的是sockets,(named) pipes和dbus。对于后两者,您可能需要Cygwin,因为它们最终依赖于安装unix包。