Я пытаюсь вызвать внешний процесс, который выполняет запись во временный файл, который я получаю с помощью withSystemTempFile. После завершения процесса я могу cat
прочитать содержимое этого файла, но само приложение завершается с ошибкой openFile: resource busy (file is locked)
при попытке прочитать этот файл с помощью readFile. Я следовал предложениям в ответах на этот вопрос и использовал ленивую версию readFile
. Вот пример кода:
module Main where
import Prelude hiding (readFile)
import System.Process (createProcess, shell)
import System.IO (Handle, hShow)
import System.IO.Temp (withSystemTempFile)
import System.IO.Strict (readFile)
main :: IO ()
main = withSystemTempFile "temp.txt" doSomeStuff
where
doSomeStuff :: FilePath -> Handle -> IO ()
doSomeStuff tempFilePath tempFilePathHandle = do
putStrLn tempFilePath
createProcess $ shell $ "echo \"test\" >> " ++ tempFilePath
getLine -- It's here just to stop program while I check that I can actually "cat" the temp file
-- here I'm able to cat the temp file
contents <- readFile tempFilePath -- here the command fails with /tmp/temp23900-0.txt: openFile: resource busy (file is locked)
putStrLn contents
Я все еще разбираюсь в Haskell, поэтому надеюсь, что это не что-то очевидное, так как у меня закончились идеи. Что дает?