У меня очень странное поведение при чтении файлов из /proc Если я лениво читаю /proc/pid/stat с помощью prelude readFile -, это работает, но не так, как я хочу. Переключение на строгое чтение с помощью Data.ByteString.readFile дает мне пустую строку.
Здесь мне нужно строгое чтение, чтобы иметь возможность сравнивать результаты двух чтений в течение короткого промежутка времени.
Таким образом, использование System.IO.readFile для чтения /proc/pid/stat просто не работает. Это дает мне тот же результат с интервалом в 0,5 секунды. Я думаю, это из-за лени и полузакрытой ручки или чего-то еще... Открытие и закрытие дескриптора файла явно работает.
h <- openFile "/proc/pid/stat" ReadMode
st1 <- hGetLine h; hClose h
Но зачем делать вышеописанное, если у нас есть строгое чтение строки байтов. Правильно?
Здесь я застрял.
import qualified Data.ByteString as B
B.readFile "/proc/pid/stat" >>= print
Это всегда возвращает пустую строку. Также проверено в GHCI. Какие-либо предложения. Спасибо.
---ОБНОВЛЕНИЕ---
Спасибо, Даниэль, за предложения.
Это то, что мне действительно нужно сделать. Это могло бы помочь полностью показать мою дилемму и внести более общие предложения.
Мне нужно рассчитать статистику процесса. Вот часть кода (просто загрузка ЦП)в качестве примера.
cpuUsage pid = do
st1 <- readProc $ "/proc" </> pid </> "stat"
threadDelay 500000 -- 0.5 sec
st2 <- readProc $ "/proc" </> pid </> "stat"
let sum1 = (read $ words st1 !! 13) +
(read $ words st1 !! 14)
sum2 = (read $ words st2 !! 13) +
(read $ words st2 !! 14)
return $ round $ fromIntegral (sum2 - sum1) * jiffy / delay * 100
where
jiffy = 0.01
delay = 0.5
readProc f = do
h <- openFile f ReadMode
c <- hGetLine h
hClose h
return c
Единственное, что работает в этой ситуации, — это явное открытие и закрытие дескрипторов с помощью hGetLine в приведенном выше фрагменте кода.Но этого недостаточно, так как некоторые файлы proc состоят из более чем одной строки, например /proc/meminfo.
Итак, мне нужна функция, которая строго читала бы весь файл. Что-то вроде hGetContents, но строгое.
Я пытался сделать это:
readProc f = do
h <- openFile f ReadMode
c <- hGetContents h
let c' = lines c
hClose h
return c'
Надеясь, что строки вызовут чтение файла полностью. Не повезло. Все равно получите пустой список.
Любая помощь, предложение очень ценятся.