我什至如何首先使用 Haskell 来分叉一个子进程?
此外,如果管道是数据共享问题的明显解决方案 - 除了使用管道之外还有其他方法吗?我熟悉 C 中共享内存段的使用(shmget、*shmat、shmdt 和 shmctl 函数)。Haskell 可以模仿吗?如果是这样,怎么做?
如果您能提供任何帮助,我将不胜感激。
我必须承认我对函数式编程语言非常陌生,尤其是在 Haskell 方面。所以如果我说了些傻话,请原谅我(并请纠正我)。
我什至如何首先使用 Haskell 来分叉一个子进程?
此外,如果管道是数据共享问题的明显解决方案 - 除了使用管道之外还有其他方法吗?我熟悉 C 中共享内存段的使用(shmget、*shmat、shmdt 和 shmctl 函数)。Haskell 可以模仿吗?如果是这样,怎么做?
如果您能提供任何帮助,我将不胜感激。
我必须承认我对函数式编程语言非常陌生,尤其是在 Haskell 方面。所以如果我说了些傻话,请原谅我(并请纠正我)。
更好的是,使用软件事务内存——即 TVar 和 TChannel。
会推荐同一本书,不同章节:http ://book.realworldhaskell.org/read/software-transactional-memory.html
这是该技术的一个很好的小例子:http: //sequence.complete.org/node/257
OP 询问与子进程而不是线程通信的问题。为此,管道是一种非常好的方法。如果你愿意,你也可以直接从 Haskell 调用 C 库函数,尽管这可能会很棘手。
这个问题在这里有一个更好的答案:是否有一些标准的 Haskell 库处理进程通信?
使用 MVar 或通道。参见 RealWorld Haskell 的第 24 章:http: //book.realworldhaskell.org/read/concurrent-and-multicore-programming.html
如果你想真正 fork 一个进程,Unix 风格,你需要forkProcess
使用http://hackage.haskell.org/package/unix-2.4.2.0/docs/System-Posix-Process.html
在这种情况下,MVars 和 TVars 不做进程间通信,所以你不能用它们来做 IPC。IPC 的所有标准技术(管道、套接字等)仍然有效。如果您想要更高级的东西,请查看 Cloud Haskell http://www.haskell.org/haskellwiki/Cloud_Haskell