gpt4 book ai didi

linux - Haskell:从/proc 读取。严格和懒惰的问题。过程统计

转载 作者:IT王子 更新时间:2023-10-29 00:19:43 27 4
gpt4 key购买 nike

我在从/proc 读取文件时有非常奇怪的行为如果我用 prelude 的 readFile 懒惰地读取/proc/pid/stat - 它可以工作但不是我想要的方式。使用 Data.ByteString.readFile 切换到严格读取会给我一个空字符串。

我这里需要严格的阅读才能在短时间内比较两次阅读的结果。

所以使用 System.IO.readFile 读取/proc/pid/stat 根本行不通。它在 0.5 秒的间隔内给了我相同的结果。我认为这是由于懒惰和半关闭 handle 或其他原因......打开和关闭文件句柄明确有效。

h <- openFile "/proc/pid/stat" ReadMode
st1 <- hGetLine h; hClose h

但是如果我们有字节串严格阅读,为什么还要这样做。对吧?

这就是我卡住的地方。

import qualified Data.ByteString as B
B.readFile "/proc/pid/stat" >>= print

这总是返回一个空字符串。还在 GHCI 中进行了测试。有什么建议么。谢谢。

--- 更新 ---

感谢 Daniel 的建议。

这才是我真正需要做的。这可能有助于完整地展示我的困境并带来更一般的建议。

我需要计算进程统计信息。这里以部分代码(仅CPU使用率)为例。

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'

希望 lines 会触发它完整读取文件。没运气。仍然得到一个空列表。

非常感谢任何帮助和建议。

最佳答案

ByteString代码是

readFile :: FilePath -> IO ByteString
readFile f = bracket (openBinaryFile f ReadMode) hClose
(\h -> hFileSize h >>= hGet h . fromIntegral)

但是 /proc/whatever 不是一个真正的文件,它是按需生成的,当你 stat 它们来获取文件大小时,你得到 0。所以 ByteStringreadFile 成功读取 0 个字节。

关于linux - Haskell:从/proc 读取。严格和懒惰的问题。过程统计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10184202/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com