OCaml文件I / O:为什么add_channel返回/ proc / <pid> / cmdline的空内容?

时间:2018-08-23 14:10:18

标签: linux file-io ocaml

我正在尝试读取/proc/<PID>/cmdline的内容,但是在一种情况下,我得到一个空字符串,在另一种情况下,我得到了预期的内容。

为什么以下不适用于此文件,但适用于其他文件:

let read_file (filename : string) : string =
  let ic = open_in_bin filename in
  let len = in_channel_length ic in
  let buf = Buffer.create (in_channel_length ic) in
  Buffer.add_channel buf ic len;
  let content = Buffer.contents buf in
  close_in ic;
  content

但是,以下内容适用于所有文件,包括proc/<PID>/cmdline

let read_file (filename : string) : string =
  let ic = open_in filename in
  let buf = Buffer.create (in_channel_length ic) in
  let contents =
    try
      while true do
        let line = input_line ic in
        Buffer.add_string buf line;
        Buffer.add_char buf '\n';
      done; assert false
    with End_of_file ->
      Buffer.contents buf in
  String.trim contents

1 个答案:

答案 0 :(得分:1)

第一个版本不起作用,因为/proc/<PID>/cmdline(以及procfs虚拟文件系统中的任何其他文件)不是常规文件,并且{{ 1}}

  

(**返回常规文件的大小(。字符数.. *)

例如,您可能会注意到in_channel_lengthfile也认为cmdline文件为空:

du

您的第一个功能将不会始终在其他非常规文件(例如管道)上运行。