2014-05-20 26 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都讓人想起。 –