Articles of procfs

Linux内核/ proc FIFO /pipe道

我目前正在尝试创build一个内核模块,它将根据内核事件生成数据,并将它们推送到一个文件中。 在阅读后,这是不好的(我同意),我决定将一个/ proc文件中的数据放在一个用户程序可以从必要时拉的数据更有意义。 然而,这个想法导致了各种各样的问题,特别是在何时以及如何清除这个文件。 所以我想……“为什么我不在/ proc中创build一个命名pipe道,并从中读取? 我有一个为proc文件设置读取函数和写入函数的一般要点,但是我仍然有一个概念上的麻烦,我怎么去做这件事。 也就是说,我将如何编写这样一个函数来获取任意数据并将其写入内核的pipe道? 有没有人有任何想法如何将数据从内核空间推送到命名pipe道? 最后,它不一定是/ proc文件(特别是如果我这样做是错误的),但这是我来到的结论。 然后,我将不得不弄清楚如何从用户空间程序附加到它,但我觉得这是一个单独的问题。

Linux的c + +:apis与/ proc文件?

我工作的应用程序来收集和发送系统信息的各种位(分区空间/免费,笔记本电池信息等)。 我没有太多的成功得到这个信息的forms直接c + + api ..虽然它的所有可用通过文件在/ proc(或类似)。 所以 – 我想知道是否读取/parsing我的c + +应用程序中的这些文件是获取此信息的适当方式,或者我应该不断尝试发现API? (注意:我正在使用statvfs)。 到目前为止,在Win32中收集这类信息似乎更容易。 看起来很奇怪。

通过/ proc / mounts监视挂载点更改

根据proc手册,可以通过打开“/ proc / mounts”并在select()调用中添加文件描述符来读取fd_set来监视linux系统中的挂载点更改。 以下代码在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++); […]

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

编辑:我已经findseq_file ,可以轻松地从内核写入大量的数据到用户空间。 我正在寻找的是相反的; 一个API,便于从用户空间读取大量数据(多个页面)。 编辑2 :我正在执行一个<stdio.h>的端口作为内核模块,能够打开类似于FILE的/proc (以及后来的其他虚拟文件系统),并处理类似于<stdio.h>input和输出<stdio.h> 。 你可以在这里find项目。 我发现很多关于内核如何将大量数据写入/ proc(用于用户空间程序)的问题,但是却没有其他办法。 让我详细说明一下: 这个问题基本上是关于input被标记的algorithm(例如int或者int和string的混合等), 假设数据可能在多个缓冲区之间被破坏 。 例如,想象下面的数据被发送到内核模块: 12345678 81234567 78123456 67812345 5678 1234 45678123 3456 7812 23456781 为了这个例子,我们假设Linux提供/ proc处理程序的页面大小是20个字节(相对于真实的4KB)。 从/ proc(在内核模块中)读取数据的函数会看到这样的数据: call 1: "12345678 81234567 78" call 2: "123456 67812345 5678" call 3: " 1234 45678123 3456 " call 4: "7812 23456781" 正如你所看到的,当第一次调用78时,它不应该被处理,直到下一个帧才能决定78是一个整数还是一个帧之间的一个剪切。 现在我发现seq_file显然只是在内核想要写数据给用户而不是读 (或者可能是HOWTO被写成可怕的)的时候。 我做了什么 […]

在Python 3中给出一个套接字和inode的进程ID

/ proc / net / tcp给我一个套接字的本地地址,端口和inode号码(例如0.0.0.0:5432和9289)。 鉴于上述信息,我想find特定进程的PID。 可以打开/ proc中的每个编号文件夹,然后使用诸如“$ sudo ls -l / proc / * / fd / 2> / dev / null | grep socket”等shell命令检查符号链接是否匹配套接字/ inode编号。 但是,这似乎在计算上比所需的更昂贵,因为任何给定系统上的进程的<5%都具有开放的TCP套接字。 find已打开给定套接字的PID的最有效方法是什么? 我宁愿使用标准库,而我目前正在用Python 3.2.3进行开发。 编辑:从问题中删除代码示例,因为它们现在包含在下面的答案中。

/ proc中可能的内部套接字状态列表

我想知道/proc/net/tcp中st列的可能值。 我认为st列等于来自netstat(8)或ss(8) STATE列。 我已经设法识别三个代码: sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode 0: 0100007F:08A0 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 7321 1 ffff81002f449980 3000 0 0 2 -1 1: 00000000:006F 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 6656 1 ffff81003a30c080 3000 0 0 2 -1 2: 00000000:0272 00000000:0000 0A 00000000:00000000 […]

了解/ proc / / io中的计数器

我正在为Munin创build一个插件来监视指定进程的统计信息。 信息来源之一是/proc/[pid]/io 。 但是我很难找出rchar / wchar和read_bytes / written_bytes之间的区别。 它们不一样,因为它们提供不同的价值。 他们代表什么?

/ proc / pid / mem上的mmap

有没有人成功地在Linux内核2.6中映射/ proc / pid / mem文件? 我得到一个ENODEV(没有这样的设备)错误。 我的电话是这样的: char * map = mmap(NULL, PAGE_SIZE, PROT_READ, MAP_SHARED, mem_fd, offset); 我已经通过查看/ proc / pid / maps文件进行了validation,debugging时执行到达此调用时,offset的值为堆栈顶部减PAGE_SIZE。 我也通过ptracevalidation过,mmap正在将errno设置为ENODEV。

我怎样才能将每个/ proc / net / tcp条目匹配到每个打开的套接字?

我想parsing来自/proc/net/tcp套接字信息,而我可以识别一些字段,如内存地址或发送队列使用,我找不到如何绑定到它的套接字描述符。 例如,与这个数据: 1: 5922140A:E459 D5C43B45:0050 01 00000000:00000000 00:00000000 00000000 1000 0 507218 1 f6ab1300 57 3 12 4 -1 我想知道哪个是对应的套接字描述符。

仅使用proc获取本地networking接口地址?

如何仅使用proc获取所有networking接口的(IPv4)地址? 经过一番广泛的调查,我发现了以下几点: ifconfig使用SIOCGIFADDR ,这需要打开套接字并提前了解所有接口名称。 它也没有logging在Linux上的任何手册页面上。 proc包含/proc/net/dev ,但这是接口统计信息的列表。 proc包含/proc/net/if_inet6 ,这正是我所需要的,但对于IPv6。 通常在proc中很容易find接口,但实际的地址是很less使用的,除非明确指出某个连接的一部分。 有一个名为getifaddrs的系统调用,这是你期望在Windows中看到的非常“神奇”的function。 它也在BSD上实现。 但是,它不是非常面向文本的,所以很难从非C语言中使用。