在Haskell中,如何在父进程和分叉子进程之间共享数据?

在Haskell中,如何在父进程和分叉子进程之间共享数据?,haskell,concurrency,process,Haskell,Concurrency,Process,首先,我该如何使用Haskell来派生子进程呢 此外,如果管道是数据共享问题的一个明显解决方案,那么除了使用管道之外,还有其他方法吗?我熟悉C语言中共享内存段的使用(shmget、*shmat、shmdt和shmctl函数)。哈斯克尔能模仿这个吗?如果是,怎么做 如果你能提供任何帮助,我将不胜感激 我必须承认,我对函数式编程语言非常陌生,对于Haskell更是如此。因此,如果我说了一些愚蠢的话,请原谅我(并请纠正我)。使用MVAR或频道。见《真实世界哈斯克尔》第24章: 更好的方法是使用软件事务

首先,我该如何使用Haskell来派生子进程呢

此外,如果管道是数据共享问题的一个明显解决方案,那么除了使用管道之外,还有其他方法吗?我熟悉C语言中共享内存段的使用(shmget、*shmat、shmdt和shmctl函数)。哈斯克尔能模仿这个吗?如果是,怎么做

如果你能提供任何帮助,我将不胜感激


我必须承认,我对函数式编程语言非常陌生,对于Haskell更是如此。因此,如果我说了一些愚蠢的话,请原谅我(并请纠正我)。

使用MVAR或频道。见《真实世界哈斯克尔》第24章:
更好的方法是使用软件事务性内存,即TVAR和Tchannel

将推荐同一本书,不同章节:


这里有一个很好的小例子说明了这项技术的实际应用:

如果您想实际使用Unix风格的fork进程,您需要使用


在这种情况下,MVAR和TVAR不进行进程间通信,因此不能使用它们进行IPC。IPC(管道、插座等)的所有标准技术仍然有效。如果您想要更高级的东西,请查看Cloud Haskell

OP询问的关于与子进程而不是线程通信的问题。为此,管道是一种完美的方式。如果愿意,也可以直接从Haskell调用C库函数,尽管这可能会很棘手


这个问题在这里有一个更好的答案:

这里的两个答案似乎都将“分叉子进程”解析为“分叉用户线程”。但考虑到问题的其他背景,这似乎并不正确。