2015-09-05 76 views
0

我有一個Scotty應用程序,它偵聽Unix套接字。我希望應用程序在退出時刪除套接字(即,當我鍵入Ctrl - C),但我不確定如何完成此操作。我main功能看起來像Scotty應用程序終止後清理

main = do 
    sock <- socket AF_UNIX Stream 0 
    bind sock $ SockAddrUnix "/tmp/my_app.sock" 
    listen sock maxListenQueue 

    scottySocket def sock $ do 
     ... 

    removeFile "/tmp/my_app.sock" 

當我鍵入按Ctrl - çremoveFile函數不叫,這似乎是一箇中斷了斯科蒂框架不會或無法趕上。有沒有辦法像這樣執行清理操作?

回答

2

最簡單的原則的方式很可能是使用bracketControl.Exception

main = bracket acquireSock cleanupSock $ \(sock, _) -> do 
    listen sock maxListenQueue 
    scottySocket def sock $ do 
     ... 
    where 
    -- Acquiring the resource. 
    acquireSock = do 
     sock <- socket AF_UNIX Stream 0 
     let sockPath = "/tmp/my_app.sock" 
     bind sock $ SockAddrUnix sockPath 
     return (sock, sockPath) 
    -- Releasing the resource. 
    cleanupSock (sock, sockPath) = do 
     removeFile sockPath 
     close sock