Haskell与OS交互(中断)



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

我对IO单子不感兴趣。或者如何让Haskell打印字符串或读取文件。我对Haskell和底层操作系统之间的层(如果它是这样工作的话)很感兴趣。Haskell本身(不是我)如何将任何内容打印到控制台?它是如何与操作系统交互的?

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

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

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

编辑:正如@Daniel Wagner所建议的,让我把这个问题更具体一些。我目前并没有遇到什么问题,我只是在理论上感到好奇。所以让我问你: Haskell如何处理Linux上套接字产生的中断?

编辑:为了更容易理解我在寻找的答案:- Haskell停止死在它的轨道当它得到一个中断?-我能保证在处理旧的连接之前回复一个新的连接吗?-它是如何得到一个中断?

Haskell没有指定。由GHC实现,有一个IO管理器,我相信它在后台使用epoll。但是,所有这些都隐藏在抽象层之后,因此您不需要担心它——只需生成一些线程,并让它们阻塞您想要读取的套接字。另请参阅"如何在Haskell中监视多个文件/套接字变为可读/可写?"。

编辑以解决你的第二个问题:不,运行时不应该在阻塞调用时停止(无论是线程运行时还是非线程运行时)。阻塞的线程被存储起来,运行时切换到准备执行的线程,正如您所期望的那样。请注意,您必须使用ghc提供的调用来实现这一点——手动使用FFI可以完全阻塞非线程运行时。关于这方面的更多细节在我的博客文章中进行了总结(跳过特定于gtk的"最佳实践"one_answers"核心"部分)。

最新更新