readFile为可读文件抛出“权限被拒绝”

时间:2017-05-05 11:05:27

标签: linux haskell

我尝试从磁盘读取所有文件并使用特定文件失败。 当文件是常规文件并且可读时(在代码中使用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),我希望返回一个空字符串,但不是错误。 我不考虑什么?

1 个答案:

答案 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 获得更多细节。