2017-05-05 76 views
1

我嘗試讀取磁盤上的所有文件,並失敗並顯示特定文件。 什麼可以阻止讀取文件,當它是一個普通的文件,並且是可讀的(都在代碼中檢查和stat)?readFile爲可讀文件拋出「權限被拒絕」

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),我希望返回一個空字符串,但不是錯誤。 我沒有考慮什麼?

回答

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 以瞭解更多詳情。

+0

非常感謝你的啓發。我閱讀了您提到的討論,並且對解決方案並不滿意 - 尤其是因爲它沒有廣泛傳播並且讓人們在幾個小時內檢查自己的代碼。 – user855443