Чисто заменить текущий процесс Haskell (exec) - PullRequest
2 голосов
/ 18 июня 2019

Я пишу программу на Haskell, единственной целью которой является выполнение другой (не Haskell) программы, после сбора некоторой информации, чтобы определить, с какими аргументами должна выполняться эта программа.

Заменить работающий процесс на Haskell достаточно просто, используя executeFile, но мне интересно, есть ли способ обеспечить правильную очистку программы на Haskell перед заменой.

Например, Control.Exception.finally обычно полезен для обеспечения выполнения действий по очистке, даже если возникает исключение, но это не будет иметь эффекта, если мы выполним совершенно другой процесс:

module Main (main) where

import Control.Exception    (finally)
import System.Posix.Process (executeFile)

main = finally (do putStrLn "opening file descriptors"
                   putStrLn "writing temporary files"
                   executeFile "ls" True [] Nothing)
               (putStrLn "cleaning up")

Приведенный выше пример никогда не напечатает «очистку».

Есть ли рекомендуемый способ выполнить такой маневр "чисто"?

Ответы [ 2 ]

3 голосов
/ 18 июня 2019

В этом нет ничего специфичного для Хаскеля. Если вы хотите что-то сделать после завершения процесса, вы не можете просто exec(3) / executeFile. Вместо этого вы должны fork(2) / forkProcess, затем в родительском элементе сделать waitpid(2) / getProcessStatus на ребенок, и сделай свою уборку, как только это вернется.


Редактировать: Выше приведено для очистки после завершения нового процесса. Если вас это не волнует, и вы просто хотите почистить, когда ваш Haskell будет готов, но новый процесс все еще работает, тогда ответ Чепнера сработает.

3 голосов
/ 18 июня 2019

Вам необходимо поставить executeFile после finally, потому что он полностью заменяет любой код из программы на Haskell.

main = do
    finally (putStrLn "opening" >> putStrLn "writing") (putStrLn "cleaning up")
    executeFile "ls" True [] Nothing

Единственноеисключение, которое может возникнуть из executeFile, является проблемой самого exec, но вы должны действовать так, как будто exec будет работать, и вы не вернетесь к коду Haskell;это односторонний goto, а не вызов подпрограммы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...