2014-05-20 25 views
1

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

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

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

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

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

编辑:@Daniel Wagner建议让我把这个问题更具体一些。 目前我并不是在解决问题,我只是理论上很好奇。 因此,让我问你: Haskell如何处理Linux上套接字产生的中断?

编辑:并使它更容易理解我在寻找的答案: - 当Haskell获得中断时,Haskell是否停止播放? - 在我可以完成旧的处理之前,是否有任何保证可以回答新的连接? - 它如何获得中断?

+0

在某些时候,Haskell标准I/O库与本地代码有一些绑定,可能是标准的C I/O例程。 –

+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特定的“最佳实践”和“胆量”部分)。

+0

我不确定我完全理解答案的第二部分。假设我有一台只有一个CPU内核的机器。我在插座上收到一个数据包(1)并开始工作。当我正在处理数据包(1)时,另一个数据包(2)进来了。说我的应用程序首先处理数据包(2)至关重要。在继续处理数据包(1)之前,我可以停止所有事情,并处理数据包(2)? – Andrey

+2

@Andrey你有多少核心在这里并不真正相关,因为即使在一个单核心的现代操作系统上,如果你需要多个操作系统线程,它们也能够提供并发的幻觉。 GHC在使用线程运行时编译程序时执行此操作。如果你想在你的线程之间使用优先级方案,你当然可以做到这一点,尽管你需要对它进行编码。这取决于你的线程如何沟通,尽管GHC提供了很多原语 - 异步例外,STM和更传统风格的MVar都让人想起。 –