当前位置: 技术问答>linux和unix
在用户态程序当中,如何使用/proc虚拟文件系统当中一个文件存放的参数??
来源: 互联网 发布时间:2016-11-08
本文导语: 现在有个/proc文件系统,里面的一个文件记录了一个变化着的系统参数,用cat打开,就可以看到这个数字当前值,比如100,如何让一个用户态的程序可以使用到这个数值呢?有什么比较efficient的方法??多谢大家指教...
现在有个/proc文件系统,里面的一个文件记录了一个变化着的系统参数,用cat打开,就可以看到这个数字当前值,比如100,如何让一个用户态的程序可以使用到这个数值呢?有什么比较efficient的方法??多谢大家指教。
|
lz说的proc_file_read一般是内核中实现read /proc下相应文件的方法,因为/proc下的文件其实是虚拟的,即并没有存在磁盘上,断电后就没了,反应的是一些内核提供给用户程序的信息,当用户程序使用read来读取/proc下的文件时,到内核中其实是调用proc_file_read,所以你若是在应用程序来读取/proc下的文件就直接read就好了,不用管proc_file_read这个东东
|
linux下有不少很给力的工具,要学会使用它们,strace就可以帮助开发人员观察程序运行时的系统调用轨迹:
[sunxq@sunxq-fc10 ~]$ cat /proc/cmdline
ro root=UUID=1c80070c-0f6f-4ded-9ce4-35db4de610b3 rhgb quiet
[sunxq@sunxq-fc10 ~]$
[sunxq@sunxq-fc10 ~]$ strace cat /proc/cmdline
execve("/bin/cat", ["cat", "/proc/cmdline"], [/* 26 vars */]) = 0
brk(0) = 0x80ec000
......
open("/proc/cmdline", O_RDONLY|O_LARGEFILE) = 3
fstat64(3, {st_mode=S_IFREG|0444, st_size=0, ...}) = 0
read(3, "ro root=UUID=1c80070c-0f6f-4ded-9"..., 1024) = 61
write(1, "ro root=UUID=1c80070c-0f6f-4ded-9"..., 61ro root=UUID=1c80070c-0f6f-4ded-9ce4-35db4de610b3 rhgb quiet
) = 61
read(3, ""..., 1024) = 0
close(3) = 0
close(1) = 0
close(2) = 0
exit_group(0) = ?
[sunxq@sunxq-fc10 ~]$
[sunxq@sunxq-fc10 ~]$ cat /proc/cmdline
ro root=UUID=1c80070c-0f6f-4ded-9ce4-35db4de610b3 rhgb quiet
[sunxq@sunxq-fc10 ~]$
[sunxq@sunxq-fc10 ~]$ strace cat /proc/cmdline
execve("/bin/cat", ["cat", "/proc/cmdline"], [/* 26 vars */]) = 0
brk(0) = 0x80ec000
......
open("/proc/cmdline", O_RDONLY|O_LARGEFILE) = 3
fstat64(3, {st_mode=S_IFREG|0444, st_size=0, ...}) = 0
read(3, "ro root=UUID=1c80070c-0f6f-4ded-9"..., 1024) = 61
write(1, "ro root=UUID=1c80070c-0f6f-4ded-9"..., 61ro root=UUID=1c80070c-0f6f-4ded-9ce4-35db4de610b3 rhgb quiet
) = 61
read(3, ""..., 1024) = 0
close(3) = 0
close(1) = 0
close(2) = 0
exit_group(0) = ?
[sunxq@sunxq-fc10 ~]$
|
对于应用程序而言,直接使用应用层的读写调用(open/read/write/close)就可以了
这些系统调用对应的底层操作由内核完成,应用程序无需关心
这些系统调用对应的底层操作由内核完成,应用程序无需关心
|
open ()
read ()
就是最给力的方法,cat程序就是这么做的。
read ()
就是最给力的方法,cat程序就是这么做的。
|
open(),read()是可以的,我也看到过完成LZ这样功能的代码。