我正在尝试读取/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
答案 0 :(得分:1)
第一个版本不起作用,因为/proc/<PID>/cmdline
(以及procfs
虚拟文件系统中的任何其他文件)不是常规文件,并且{{ 1}}
(**返回常规文件的大小(。字符数.. *)
例如,您可能会注意到in_channel_length
或file
也认为cmdline文件为空:
du
您的第一个功能将不会始终在其他非常规文件(例如管道)上运行。