【问题标题】:Haskell interacting with the OS (interrupts)Haskell 与操作系统交互(中断)
【发布时间】:2014-07-09 04:32:46
【问题描述】:

我的问题是 Haskell 如何与系统交互。 比如IO是怎么发生的?

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

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

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

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

编辑:正如@Daniel Wagner 所建议的,让我把这个问题说得更具体一些。 我目前并没有为问题而苦苦挣扎,我只是理论上很好奇。 所以让我问你这个: Haskell 如何处理 Linux 上的套接字产生的中断?

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

【问题讨论】:

  • 在某些时候,Haskell 标准 I/O 库与本机代码有一些绑定,可能是标准 C I/O 例程。
  • 你的问题有点含糊。 (操作系统很大!)是“我如何使用套接字?”?或者可能是,“我如何生成另一个运行特定命令的进程?”?如果两者都不是,那么您现在面临的实际问题是什么?你需要做什么你不知道该怎么做?

标签: sockets haskell io operating-system


【解决方案1】:

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

【讨论】:

  • 我不确定我是否完全理解答案的第二部分。假设我有一台只有一个 CPU 内核的机器。我在套接字上收到一个数据包 (1) 并开始处理它。当我处理数据包 (1) 时,另一个数据包 (2) 进来了。假设首先处理数据包 (2) 对我的应用程序至关重要。在继续处理数据包 (1) 之前,我可以停止一切并处理数据包 (2) 吗?
  • @Andrey 你有多少核心在这里并不重要,因为即使在一个核心上,如果你要求多个操作系统线程,现代操作系统也完全能够提供并发错觉。当您使用线程运行时编译程序时,GHC 会执行此操作。如果您想要线程之间的优先级方案,您当然可以这样做,尽管您需要对其进行编码。尽管 GHC 提供了许多原语 - 异步异常、STM 和更传统的风格 MVar,但您可以自行决定线程如何通信。
猜你喜欢
  • 2017-11-02
  • 2014-12-05
  • 1970-01-01
  • 1970-01-01
  • 2013-04-08
  • 1970-01-01
  • 1970-01-01
  • 2012-09-30
  • 1970-01-01
相关资源
最近更新 更多