Haskell:Чтение из /proc. Проблемы со строгостью и ленью. Статистика процесса

У меня очень странное поведение при чтении файлов из /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
  1. Prelude.readFile не работает из-за лени
  2. Строгие функции из ByteString не работают. Спасибо Даниил за объяснение.
  3. withFile будет работать (он правильно закроет дескриптор), если я запихну в него все вычисления, но тогда интервал не будет строго 0,5, так как вычисления требуют времени.
  4. Явное открытие и закрытие дескрипторов и использование hGetContents не работает! По той же причине readFile этого не делает.

Единственное, что работает в этой ситуации, — это явное открытие и закрытие дескрипторов с помощью hGetLine в приведенном выше фрагменте кода.Но этого недостаточно, так как некоторые файлы proc состоят из более чем одной строки, например /proc/meminfo.

Итак, мне нужна функция, которая строго читала бы весь файл. Что-то вроде hGetContents, но строгое.

Я пытался сделать это:

readProc f = do
  h <- openFile f ReadMode
  c <- hGetContents h
  let c' = lines c
  hClose h
  return c'

Надеясь, что строки вызовут чтение файла полностью. Не повезло. Все равно получите пустой список.

Любая помощь, предложение очень ценятся.

8
задан r.sendecky 17 April 2012 в 05:08
поделиться