2015-09-05 2 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 - C функция removeFile не называется, что, как представляется, прерывание, что структура Скотти не может или не поймать. Есть ли способ выполнить действия по очистке, подобные этому?

ответ

2

Самый простой способ принципиален, вероятно, использует bracket из Control.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 
Смежные вопросы