2015-09-05 75 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