lseek(fd,0)然后再read(fd,buf)使用/proc/stat文件而不是重新打开它以便下次获取此文件的更新内容?mmap()打开这个文件后的调用真的如何(见下文)?我遇到的问题是顶级报告CPU使用率太低(软件中断为10%对比100%).strace表示top不会重新打开此文件,而是lseeks开始并再次读取它.不知何故,下次从这个文件读取的内容与我/proc/stat单独运行cat for file 时的内容不匹配.
另外如果我同时/proc/stat在循环中运行top和cat ,那么top会开始报告正确的CPU使用率.
我发现的另一个区别是top mmap()在打开/proc/stat文件后立即使用call ,而cat不是那样做.我不确定这是否也与我的问题有关(因为filesdes=-1这里):
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f7b37649000
Run Code Online (Sandbox Code Playgroud)
我正在使用带有2.6.32-27服务器映像的Ubuntu 10.04.1桌面版.CPU是Intel Q6600.
/ proc/stat显示用户,nice,sys,idle,iowait,irq和sirq的滴答:
cpu 6214713 286 1216407 121074379 260283 253506 197368 0 0 0
如何使用这些值计算用户的个人利用率(%),等等?就像'top'或'vmstat'中显示的值一样.
进程名称允许的最大长度是多少?我正在从/proc/[pid]/stat文件中读取进程名称,我想知道我需要的最大缓冲区.
我很确定有一个可配置的限制,但却无法找到它的位置.
我想在/proc/driver目录下创建一个文件.我想使用宏proc_root_driver(或其他提供的)而不是明确使用"driver/MODULE_NAME".我用create_proc_entry:
struct proc_dir_entry *simpleproc_fops_entry;
simpleproc_fops_entry = create_proc_entry(MODULE_NAME, 0400, NULL /* proc_root_dir */);
Run Code Online (Sandbox Code Playgroud)
谷歌搜索后,我发现使用建议proc_root_driver,但当我使用它时,我得到错误
proc_root_driver在此函数中未声明
而且,proc_root_driver在linux/proc_fs.h中不可用.
我试图像这样声明结构:
struct proc_dir_entry proc_root;
struct proc_dir_entry *proc_root_driver = &proc_root;
Run Code Online (Sandbox Code Playgroud)
编译错误消失了,但文件没有出现在/proc/driver或/proc.如何创建条目/proc?
我对共享库有一个重大疑问.我研究的是,不同进程共享的库的虚拟地址对于所有这些进程都是相同的.但是我尝试通过以下命令集使用proc文件系统来查看相同的内容:
$ cat /proc/*/maps | grep /lib/libc-2.12.1.so
Run Code Online (Sandbox Code Playgroud)
输出是:
0025a000-003b1000 r-xp 00000000 08:07 1046574 /lib/libc-2.12.1.so
003b1000-003b2000 ---p 00157000 08:07 1046574 /lib/libc-2.12.1.so
003b2000-003b4000 r--p 00157000 08:07 1046574 /lib/libc-2.12.1.so
003b4000-003b5000 rw-p 00159000 08:07 1046574 /lib/libc-2.12.1.so
0086d000-009c4000 r-xp 00000000 08:07 1046574 /lib/libc-2.12.1.so
009c4000-009c5000 ---p 00157000 08:07 1046574 /lib/libc-2.12.1.so
009c5000-009c7000 r--p 00157000 08:07 1046574 /lib/libc-2.12.1.so
009c7000-009c8000 rw-p 00159000 08:07 1046574 /lib/libc-2.12.1.so
00110000-00267000 r-xp 00000000 08:07 1046574 /lib/libc-2.12.1.so
00267000-00268000 ---p 00157000 08:07 1046574 /lib/libc-2.12.1.so
00268000-0026a000 r--p 00157000 08:07 1046574 /lib/libc-2.12.1.so
0026a000-0026b000 rw-p 00159000 08:07 1046574 /lib/libc-2.12.1.so …Run Code Online (Sandbox Code Playgroud) 我很好奇两件事,
我正在分析unix/linux中的procfs,并且一些loginuid进程真的很奇怪.有些pid的登录名是一个很大的数字:4294967295.它们是守护进程或系统事件还是最重要的事情?
# cat /proc/11071/loginuid
4294967295
Run Code Online (Sandbox Code Playgroud) 我已经在 Ubuntu 12.04 上安装了 docker 0.11.1。当我运行以下命令时,我试图将 shmmax 从其固定值 (32 M) 更改为更大 (1G) 的值(1G):
sysctl -w kernel.shmmax=1073741824
error: "Read-only file system" setting key "kernel.shmmax"
Run Code Online (Sandbox Code Playgroud)
那是因为/proc安装ro在容器中。
有人能告诉我如何r/w在我的容器中安装 proc来更改它吗?
我这样读/proc/<pid>/status:
std::ifstream file(filename);
std::string line;
int numberOfLinesToRead = 4;
int linesRead = 0;
while (std::getline(file, line)) {
// do stuff
if (numberOfLinesToRead == ++linesRead) {
break;
}
}
Run Code Online (Sandbox Code Playgroud)
我注意到在极少数情况下会std::getline挂起.
getline返回false./proc/<pid>/status?我正在尝试从/proc/<pid>/smaps我的 C++ 二进制文件中解析进程的 PSS 值。
根据这个 SO answer,/proc/<pid>/smaps例如天真地读取文件ifstream::getLine()将导致数据集不一致。建议的解决方案是使用read()系统调用一次性读取整个数据,例如:
#include <unistd.h>
#include <fcntl.h>
...
char rawData[102400];
int file = open("/proc/12345/smaps", O_RDONLY, 0);
auto bytesRead = read(file, rawData, 102400); // this returns 3722 instead of expected ~64k
close(file);
std::cout << bytesRead << std::endl;
// do some parsing here after null-terminating the buffer
...
Run Code Online (Sandbox Code Playgroud)
我现在的问题是,尽管我使用了 100kB 的缓冲区,但只返回了 3722 个字节。查看cat使用 strace 解析文件时的作用,我看到它使用多次调用read()(每次读取时也获取大约 3k 字节)直到read()返回 0 - 如文档 …