diff --git a/System/Linux/Proc.hs b/System/Linux/Proc.hs
--- a/System/Linux/Proc.hs
+++ b/System/Linux/Proc.hs
@@ -1,4 +1,4 @@
-{-# LANGUAGE TypeOperators #-}
+{-# LANGUAGE TypeOperators, ScopedTypeVariables #-}
 -- This library is for parse information from /proc on Linux.
 module System.Linux.Proc (
 -- * Types
@@ -13,16 +13,21 @@
     ) where
 
 import Control.Applicative
+import Control.Exception
 import Control.Monad
 import Data.Char
-import Data.Word
 import Data.Int
 import Data.Maybe
+import Data.Word
 import System.Directory
 import System.FilePath
-import Text.XFormat.Read
 import System.Posix.Types
+import System.IO.Error
+import System.IO
+import Text.XFormat.Read
 
+import qualified Control.Exception as Exc
+
 type ProcessName = String
 type ProcessInfo = [String]
 data ProcessState = Running
@@ -69,19 +74,27 @@
     >>= \dirs -> return $ filter isIntegerString dirs
 
 -- | Get process status with given process id.
-procGetProcessStatus :: ProcessID -> IO ProcStatus
-procGetProcessStatus pid = liftM procParseStatus $ procGetProcessInfo pid
+procGetProcessStatus :: ProcessID -> IO (Maybe ProcStatus)
+procGetProcessStatus pid = do
+  info <- procGetProcessInfo pid
+  return $ case info of 
+             Just i  -> Just $ procParseStatus i
+             Nothing -> Nothing
 
 -- | Get information for all running processes.
 procGetAllProcessStatus :: IO [ProcStatus]
-procGetAllProcessStatus = 
-    procGetProcessDirs
-    >>= mapM (\pid -> procGetProcessStatus (read pid :: ProcessID))
+procGetAllProcessStatus = do
+    dirs <- procGetProcessDirs
+    status <- mapM (\pid -> procGetProcessStatus (read pid :: ProcessID)) dirs
+    return $ catMaybes status
 
 -- | Get process status with given process id.
-procGetProcessInfo :: ProcessID -> IO ProcessInfo
-procGetProcessInfo pid =
-    liftM words $ readFile $ procPath </> show pid </> procStatFile
+procGetProcessInfo :: ProcessID -> IO (Maybe ProcessInfo)
+procGetProcessInfo pid = do
+  let filepath = procPath </> show pid </> procStatFile
+  Exc.catch 
+     (liftM (Just . words) $ readFile filepath)
+     (\(_ :: IOError) -> return Nothing) -- skip current file if failed with `readFile`
 
 -- | Parse status from given info.
 procParseStatus :: ProcessInfo -> ProcStatus
diff --git a/proc.cabal b/proc.cabal
--- a/proc.cabal
+++ b/proc.cabal
@@ -1,5 +1,5 @@
 name:			proc
-version:		0.0.2
+version:		0.0.3
 Cabal-Version:	>= 1.8
 license:		GPL-3
 license-file:	LICENSE
