我尝试从磁盘读取所有文件并使用特定文件失败。
当文件是常规文件并且可读时(在代码中使用stat
检查),什么会阻碍读取文件?
stat "/proc/1/task/1/maps"
File: /proc/1/task/1/maps
Size: 0 Blocks: 0 IO Block: 1024 regular empty file
Device: 4h/4d Inode: 209680 Links: 1
Access: (0444/-r--r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2017-05-05 11:34:57.840873751 +0200
Modify: 2017-05-05 11:34:57.840873751 +0200
Change: 2017-05-05 11:34:57.840873751 +0200
Birth: -
代码是
module Main
import System.Posix.Files
main = do
putStrLn "tets_maps - trying to read file /proc/1/task/1/maps"
let fn = "/proc/1/task/1/maps" :: FilePath
status <- getSymbolicLinkStatus fn
readable <- fileAccess fn True False False
putStrLn "tets_maps - status regularFiel and readable"
putStrLn . show . isRegularFile $ status
putStrLn . show $ readable
res1 :: String <- readFile fn
putStrLn "tets_maps - result"
输出结果为:
readProblem: /pro`c/1/task/1/maps: openFile: permission denied (Permission denied)`
为什么permission denied
在测试文件具有读访问权限之前进行测试?我知道该文件的大小为0(是emtpy),我希望返回一个空字符串,但不是错误。
我不考虑什么?
答案 0 :(得分:4)
这不是Haskell问题,而是Linux特有的问题。即使它表明您有权阅读,也不允许:
~ $ ls -lh /proc/1/task/1/maps
-r--r--r-- 1 root root 0 May 5 16:56 /proc/1/task/1/maps
~ $ cat /proc/1/task/1/maps
cat: /proc/1/task/1/maps: Permission denied
/proc
内的文件与内核有关,它们中有特殊情况。你可以阅读this
discussion
获得更多细节。