【发布时间】:2011-11-06 06:08:10
【问题描述】:
所以,一开始这似乎很简单,但是在爬了谷歌和这里之后,答案似乎并没有我最初想的那么简单。
基本上,我正在编辑一个 MINIX 内核,作为我操作系统课程实践的一部分,并且我必须添加一个小函数,当您在信息服务器中按下一个功能键时,它会吐出正在运行的进程的数量。我已经想出了如何集成功能,以便所有其他东西都能正常工作,但对于我的一生,我无法弄清楚如何将系统中运行的当前进程数放入我的 C 代码和变量中打印出来。
首先,我认为会有一个漂亮的系统调用,例如 SYS_NUMPROCS 或返回值的东西,但没有运气。 然后,我尝试将系统(“ps -ax | wc -l”)的输出通过管道传输到文件,但文件不会创建。我尝试使用 popen() 也没有运气 - 即使将简单的“ls”读入缓冲区,它也只会轰炸代码并“挂起”代码的运行,因此没有输出。
所以现在我真的很难过,任何帮助都会非常棒,因为此时我已经用尽了所有明显的选择。
我现在唯一能想到的两件事就是循环计算所有进程,但首先你必须进入系统的进程列表,我听说过关于 /proc/ 作为目录的模糊说法,但是我不知道如何访问/运行它,或者它如何链接到首先获取进程数。
谢谢大家(哈哈双关语),伙计们:)
另外,我没有明确包含代码,因为除了基本的 printf'ing 用于修饰输出之外,我没有写任何东西,因为我尝试过的所有东西都没有给我带来任何快乐:/
编辑说明:伙计们,这是一个内核编辑——我正在编写函数来打印系统 C 文件中的信息,然后重新编译内核并重新启动系统进行测试。它是 UNIX (MINIX) 内核,不是 Linux 内核,也不是用户模式程序。
根据你们中的一些人的要求,我的 popen() 代码如下:
public void cos_dmp(){
char buffer[512];
FILE * f;
f = popen("ps -ax | wc -l","r");
fgets(buffer, sizeof(buffer),f);
//buffer should now contain result of popen()
printf(buffer);
}
根据我的记忆,这有点像拼凑而成的版本,它保持超简单,并向你们展示我正在尝试做的事情。不过,除了本质上调用 system() 调用的输出之外,还必须有更好的方法来做到这一点。
再次编辑:上面的代码完全可以从用户程序中运行,但不能从内核函数中运行。有人知道为什么吗?:/
【问题讨论】:
-
那么你是在编辑内核源代码,还是在尝试编写一个普通的程序?
-
Linux != Minix。 Torvalds 和 Tanenbaum 都会对你非常失望......
-
Minix 不是 linux,它是 unix... Tannenbaum 可能会因为暗示他的内核设计与 Torvald 的设计相似而杀死你。如果您正在阅读 linux 内核指南,您可能会出错。 (如果这是我没听说过的其他 minix,评论无效;-))
-
是的,是的,你没关系,它是 UNIX,在你们都指出之后我才想起 :) - 在这一点上,很多内核在核心功能方面是相似的对于 Linux 和 Minix,我必须更改的内容可能相似,但我什至还没有真正找到一种 Linux 方法。
-
您的
fgets()将在字符串末尾留下一个换行符 ('\n')。如果你不完全控制buffer的内容,printf(buffer)通常是不明智的(如果它包含%字符,你就有麻烦了);使用printf("%s", buffer)或fputs(buffer, stdout)。