我正在寫一個Haskell結合一些圖書館,有一個函數void foo()
,這裏面調用select()
代碼接口。當我從Haskell調用這個函數時,select()
調用開始不斷返回EINTR
。這混淆了庫代碼,並開始循環。與調用select()
在#haskell
IRC頻道,有人告訴我,從綁定線程運行foo()
。我用runInBoundThread
這個,現在一切似乎工作。但在少數情況下,我在控制檯收到Alarm clock
消息(好吧,我發現它意味着應用程序捕獲SIGALRM)。
我不知道這是來處理這個問題正確的方法,我不希望依賴於Control.Concurrency
。我該怎麼辦?
'Control.Concurrent'是標準庫的一部分 - 這取決於它是一樣的視哈斯克爾。你爲什麼不想使用該模塊? (雖然我承認報警消息是奇怪的,我從來沒有看到) – luqui
我聽到GHC使用SIGALRM和SIGVTALRM內部線程管理。如果外部代碼線程對這些信號敏感,則應該阻止它們進入該線程。見例如'Database.HDBC.MySQL.RTS'中的'withRTSSignalsBlocked'。 –