Haskell与OS交互(中断)

时间:2014-05-20 18:58:51

标签: sockets haskell io operating-system

我的问题是Haskell如何与系统交互。 例如,IO如何发生?

我对IO monad不感兴趣。或者如何使Haskell打印字符串或读取文件。 我对Haskell和底层操作系统之间的层(如果它是如何工作的)感兴趣。 Haskell本身(不是我)如何在控制台上打印任何东西?它是如何与操作系统交互的?

例如,在Python中我可以执行任何系统命令。我可以做到echo message

这真正变得非常重要的是了解套接字如何工作,以及如何在我获得新连接时确保我的程序被中断。

在python中,一种方法是使用epoll,这是操作系统的一部分(我相信只是接管了python进程的控制权)。

编辑:@Daniel Wagner建议让我更具体地提出这个问题。 我目前没有遇到问题,我理论上只是好奇。 那么让我问你这个问题: Haskell如何处理Linux上套接字产生的中断?

编辑:为了更容易理解我在寻找答案中的内容:   - 当Haskell中断时,Haskell是否在它的轨道上停止了?   - 在我完成处理旧连接之前,有什么保证可以回答新连接吗?   - 它是如何获得中断的?

1 个答案:

答案 0 :(得分:4)

Haskell没有说明。由GHC实施,我认为有一个IO管理器在后台使用epoll。所有这些都隐藏在一个抽象层之后,所以你不必担心它 - 只是产生一些线程并让它们阻塞你想要读取的任何套接字。另请参阅" How can I watch multiple files/socket to become readable/writable in Haskell?"。

编辑以解决您的第二个问题:不,运行时不应该阻止调用(无论是线程还是非线程运行时)。被阻止的线程被存储起来,运行时切换到准备执行的线程,就像您期望的那样。请注意,您必须使用GHC提供的调用才能生效 - 手动使用FFI可以完全阻止非线程运行时。关于这方面的更多细节总结在this blog post of mine中(跳过特定于gtk的"最佳实践和#34;以及"胆量"部分)。