Ich schreibe eine Haskell-Bindung an einige der Bibliothek und es gibt eine Funktion void foo()
, die select()
innerhalb ruft. Wenn ich diese Funktion von Haskell anrufe, beginnt der select()
Aufruf ständig EINTR
zurückzukehren. Dies verwirrt den Bibliothekscode und es beginnt für immer zu loopen.Schnittstelle mit dem Code, der ruft select()
Im #haskell
IRC-Kanal wurde mir gesagt, foo()
von einem gebundenen Thread zu laufen. Ich habe runInBoundThread
dafür verwendet und jetzt scheint alles zu funktionieren. Aber in einigen seltenen Fällen bekomme ich Alarm clock
Nachricht in der Konsole (Ok, ich habe gefunden, bedeutet, dass App SIGALRM fängt).
Ich bin mir nicht sicher, es ist richtige Weise, um dieses Problem zu behandeln, und ich möchte nicht auf Control.Concurrency
abhängen. Was soll ich machen?
'Control.Concurrent' Teil der Standardbibliothek ist - je nach ihm der gleichen wie in Abhängigkeit von Haskell ist. Warum willst du dieses Modul nicht benutzen? (Obwohl ich zugeben muss, dass die Alarmmeldungen seltsam sind, habe ich das nie gesehen) – luqui
Ich höre GHC verwendet intern SIGALRM und SIGVTALRM für Thread-Management. Wenn der fremde Code-Thread für diese Signale empfindlich ist, sollten Sie sie für diesen Thread blockieren. Siehe z.B. 'withRTSSignalsBlocked' von' Database.HDBC.MySQL.RTS'. –