标签: procfs

第二次从Proc-FS文件读取时使用lseek()是否安全

  1. 是否可以安全使用lseek(fd,0)然后再read(fd,buf)使用/proc/stat文件而不是重新打开它以便下次获取此文件的更新内容?
  2. 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.

linux cpu-usage seek procfs

8
推荐指数
1
解决办法
1423
查看次数

从/ proc/stat计算用户,nice,sys,idle,iowait,irq和sirq

/ proc/stat显示用户,nice,sys,idle,iowait,irq和sirq的滴答:

cpu 6214713 286 1216407 121074379 260283 253506 197368 0 0 0

如何使用这些值计算用户的个人利用率(%),等等?就像'top'或'vmstat'中显示的值一样.

c python linux kernel procfs

8
推荐指数
2
解决办法
5274
查看次数

进程名称长度的最大允许限制是多少?

进程名称允许的最大长度是多少?我正在从/proc/[pid]/stat文件中读取进程名称,我想知道我需要的最大缓冲区.

我很确定有一个可配置的限制,但却无法找到它的位置.

unix linux process procfs

8
推荐指数
1
解决办法
5368
查看次数

如何在/ proc/driver下创建proc条目?

我想在/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

kernel-module linux-kernel procfs

6
推荐指数
1
解决办法
1万
查看次数

Linux下的共享库加载地址

我对共享库有一个重大疑问.我研究的是,不同进程共享的库的虚拟地址对于所有这些进程都是相同的.但是我尝试通过以下命令集使用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)

linux shared-libraries virtual-memory procfs

6
推荐指数
1
解决办法
3625
查看次数

有什么像/ proc for windows

我很好奇两件事,

  1. 什么是与Windows一起发布的/ proc最接近的等价物
  2. 是否有任何产品向Windows添加proc文件系统?

windows filesystems equivalent procfs

6
推荐指数
1
解决办法
4335
查看次数

/ proc/pid/loginuid中的一些uid很奇怪

我正在分析unix/linux中的procfs,并且一些loginuid进程真的很奇怪.有些pid的登录名是一个很大的数字:4294967295.它们是守护进程或系统事件还是最重要的事情?

# cat /proc/11071/loginuid
4294967295
Run Code Online (Sandbox Code Playgroud)

unix linux procfs

6
推荐指数
1
解决办法
3530
查看次数

如何将 docker 中的 /proc 文件系统重新挂载为 ar/w 系统?

我已经在 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来更改它吗?

linux ubuntu shared-memory procfs docker

6
推荐指数
1
解决办法
9706
查看次数

正确的阅读方式/ proc/pid/status

我这样读/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挂起.

  1. 为什么会这样?我觉得proc文件系统应该处于一定的一致状态,并且不应该出现缺少换行的情况.我的假设是当发生EOF /错误时getline返回false.
  2. 什么是推荐的,安全的阅读方式/proc/<pid>/status

c++ linux string std procfs

6
推荐指数
1
解决办法
2303
查看次数

获得 /proc/pid/smaps 一致快照的正确方法是什么?

我正在尝试从/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 - 如文档 …

linux procfs

6
推荐指数
1
解决办法
485
查看次数