标签: procfs

如何将每个/ proc/net/tcp条目与每个打开的套接字匹配?

我正在尝试解析套接字信息/proc/net/tcp,虽然我可以识别一些字段,例如内存地址或发送队列使用,但我无法找到每个条目如何绑定到其套接字描述符.例如,有了这些数据:

1: 5922140A:E459 D5C43B45:0050 01 00000000:00000000 00:00000000 00000000  1000        0 507218 1 f6ab1300 57 3 12 4 -1  
Run Code Online (Sandbox Code Playgroud)

我想知道哪个是对应的套接字描述符.

c linux networking procfs

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

VmRSS和居民设置大小如何匹配?

我解析数据/proc/[pid]/statm以获得关于某个进程的内存使用情况的线索.man proc说明驻留集大小(以"页面"衡量)与VmRSS(KB ??)相同/proc/[pid]/status.由于它们具有不同的值,我想了解这些值之间的联系.是否有某种因素我可以在某处阅读/proc(我想到了VmPTE,但它的......其他......)?我应该解析哪一个才能获得某个进程的已用内存的大小?

#ex 1782 = firefox

~$ cat /proc/1782/statm
  224621 46703 9317 11 0 98637 0
#          \--- resident set size

~$ cat /proc/1782/status | grep Vm
  VmPeak:     935584 kB
  VmSize:     898484 kB
  VmLck:           0 kB
  VmHWM:      257608 kB
  VmRSS:      186812 kB
  VmData:     394328 kB
  VmStk:         220 kB
  VmExe:          44 kB
  VmLib:       61544 kB
  VmPTE:        1224 kB
  VmSwap:          0 kB
Run Code Online (Sandbox Code Playgroud)

linux procfs

13
推荐指数
3
解决办法
3万
查看次数

如何解释/ proc/bus/pci/devices的内容?

'cat/proc/bus/pci/devices'的前几个字段是可以理解的.

字段1 - BusDevFunc
字段2 - 供应商Id +设备Id
字段3 - 中断线字段
4 - BAR 0
和其后的BAR寄存器(0-5).

打印BAR寄存器后,其他字段是什么?具体来说,打印出哪个PCI配置空间寄存器(偏移)?

linux pci-bus procfs

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

什么是create_proc_entry()的替代方案

由于create_proc_entry功能已被弃用,它的替代品是什么?我试图创建一个简单的proc条目,create_proc_entry但得到了这个错误:

错误:函数'create_proc_entry'的隐式声明

create_proc_entry在proc_fs.h中抓了一下但是没找到它.有什么东西我缺少或有替代方法吗?

linux-kernel procfs

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

dmesg没有显示printk语句

我正在尝试创建一个proc条目.我的init_module函数如下

int init_module()
{
printk(KERN_INFO "proc2:Module Loaded\n");
proc_entry=proc_create_data(proc_name,0644,NULL,&fops,NULL);
if(proc_entry==NULL)
{
    printk(KERN_INFO "proc2:Error registering proc entry");
}
else
{
    printk(KERN_INFO "proc2:Proc Entry Created");
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)

以下是清理方法

void cleanup_module()
{
printk(KERN_INFO "proc2:module unloaded");
remove_proc_entry(proc_name,proc_entry);
}
Run Code Online (Sandbox Code Playgroud)

程序的其余部分包括变量定义和回调函数.

当我编译这个程序时,它编译得很好.当我使用insmod它时不回复我提示. lsmod列出我的模块和一个人使用的节目(不知道是什么). dmesg没有显示上述printk消息.

你能告诉我这里有什么问题吗?

linux-kernel procfs

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

Linux c ++:apis vs/proc文件?

我正在开发一个应用程序来收集和发送各种系统信息(分区空间/免费,笔记本电脑电池信息等).我没有太多成功以直接c ++ api的形式获取此信息..虽然它可以通过/ proc(或类似)中的文件获得.

所以 - 我想知道在我的c ++应用程序中读取/解析这些文件是否是获取此信息的适当方式,还是应该继续尝试发现API?(注意:我正在使用statvfs).

到目前为止,看起来在Win32中收集此类信息更容易.似乎很奇怪.

c++ linux battery procfs disk-partitioning

10
推荐指数
1
解决办法
2380
查看次数

通过/ proc/mounts监视安装点更改

根据proc手册,可以通过打开"/ proc/mounts"监视linux系统中的挂载点更改,并添加文件描述符以读fd_setselect()调用.

以下代码适用于Ubuntu 9.04,而不适用于Ubuntu 10.04(2.6.32 linux内核):

int mfd = open("/proc/mounts", O_RDONLY, 0);

fd_set rfds;
struct timeval tv;
int rv;

FD_ZERO(&rfds);
FD_SET(mfd, &rfds);
tv.tv_sec = 5;
tv.tv_usec = 0;

int changes = 0;
while ((rv = select(mfd+1, &rfds, NULL, NULL, &tv)) >= 0) {
    if (FD_ISSET(mfd, &rfds)) {
        fprintf(stdout, "Mount points changed. %d.\n", changes++);
    }

    FD_ZERO(&rfds);
    FD_SET(mfd, &rfds);
    tv.tv_sec = 5;
    tv.tv_usec = 0;

    if (changes > 10) {
        exit(EXIT_FAILURE);
    }
}
Run Code Online (Sandbox Code Playgroud)

可编辑的代码段.

文件描述符总是在一台机器上可读,因此它会在select调用中不断弹出.即使坐骑没有变化.

我在这里错过了什么吗?

在此先感谢您的帮助!

男人5 …

c linux filesystems mount procfs

10
推荐指数
1
解决办法
5886
查看次数

mmap on/proc/pid/mem

有没有人成功用Linux内核2.6 mmap'/proc/pid/mem文件?我收到一个ENODEV(没有这样的设备)错误.我的电话看起来像这样:

char * map = mmap(NULL, PAGE_SIZE, PROT_READ, MAP_SHARED, mem_fd, offset);
Run Code Online (Sandbox Code Playgroud)

我通过在调试时查看/ proc/pid/maps文件进行验证,当执行到达此调用时,offset具有堆栈顶部的值减去PAGE_SIZE.我还用ptrace验证了mmap是将errno设置为ENODEV.

c linux mmap systems-programming procfs

10
推荐指数
1
解决办法
4263
查看次数

如何解析通过/ proc文件传递给内核模块的大量数据?

编辑:我发现seq_file很容易从内核向用户空间写入大量数据.我正在寻找的是相反的; 一个API,便于从用户空间读取大量数据(多个页面).

编辑2:我正在实现一个<stdio.h>作为内核模块的端口,它能够打开/proc(以及后来的其他虚拟文件系统),类似于FILEs并处理类似的输入和输出<stdio.h>.你可以在这里找到这个项目.


我发现了很多关于内核如何将大量数据写入/ proc(用于用户空间程序)的问题,但没有其他方面.让我详细说明:

这个问题基本上是关于输入被标记化的算法(例如ints或混合int和字符串等),假设数据可能在多个缓冲区之间被打破.

例如,假设以下数据被发送到内核模块:

12345678 81234567 78123456 67812345 5678 1234 45678123 3456 7812 23456781
Run Code Online (Sandbox Code Playgroud)

并且为了这个例子,假设Linux提供/ proc处理程序的页面大小是20字节(相对于真正的4KB).

从/ proc(在内核模块中)读取数据的函数然后查看数据:

call 1:
"12345678 81234567 78"
call 2:
"123456 67812345 5678"
call 3:
" 1234 45678123 3456 "
call 4:
"7812 23456781"
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,当78在第一次调用中读取时,它应该在下一帧之前处理,以便它决定78帧之间是整数还是一帧.

现在我发现seq_files显然只是在内核想要数据写入用户而不是读取时(或者可能是HOWTO写得非常糟糕).

我做了什么

到目前为止,我已经提出了以下解决方案(我是从记忆中写的,所以我可能会错过几次错误检查,但请耐心等待):

在初始化阶段(比如说init_module …

c linux buffer kernel procfs

10
推荐指数
1
解决办法
2074
查看次数

如何为每个线程确定Linux内核任务的堆栈指针?

我正在研究一种有时会劫持应用程序执行的工具,包括在不同的堆栈中工作.

我正在尝试让内核在执行某些系统调用时总是看到应用程序堆栈,这样它就会在/ proc/pid/maps中的正确位置打印[stack]限定符.

但是,简单地修改系统调用周围的esp似乎是不够的.当我在"cat/proc/self/stat"上使用我的工具时,我看到kstkesp(这里的条目29)有时具有我想要的值,但有时会有一个不同的值,对应于我的备用堆栈.

我想了解:

  1. 如何确定/ proc/self/stat:29中的值?
  2. 我可以修改它,以便它可靠地具有适当的值吗?
  3. 如果2很难回答,你会建议我在哪里理解为什么这个值间歇性地不正确?

system-calls linux-kernel procfs

10
推荐指数
1
解决办法
437
查看次数