从C代码到Minix系统上的运行进程数

时间:2011-08-29 18:40:07

标签: c unix process minix

所以,这一开始看起来很简单,但在抓住谷歌和这里之后,答案看起来并不像我原先想象的那么简单。

基本上,我正在编辑一个MINIX内核,作为我的操作系统课程的一部分,我必须添加一个小函数,当你点击Information Server中的一个功能键时,该函数会显示正在运行的进程数。我已经想出如何集成功能,所以其他所有东西都可以工作,但对于我的生活,我无法弄清楚如何将系统中运行的当前进程数量转换为我的C代码并转换为变量打印出来。

首先,我认为会有一个漂亮的Syscall,比如SYS_NUMPROCS,或者某些东西会返回值,但没有运气。 然后,我尝试将输出从系统(“ps -ax | wc -l”)传输到文件,并且文件不会创建。我尝试使用popen()并且没有运气 - 即使将简单的“ls”读入缓冲区,它只是炸弹代码并“挂起”代码的运行,因此没有输出。

所以现在我真的很难过,任何帮助都会超级棒,因为在这一点上我已经筋疲力尽了所有明显的选择。

我现在能想到的唯一两件事就是循环计算所有进程,但首先你必须进入系统的进程列表,我听到关于/ proc /作为目录的模糊事情,但是我不知道如何访问/运行它或如何链接到首先获得进程数。

感谢堆叠(哈哈双关语),伙计们:)

另外,我没有明确地包含代码,因为我没有写过基本的printf'ing用于化妆品输出,因为我试过的任何东西都没有带给我任何快乐:/

编辑笔记:伙计们,这是一个内核编辑 - 我正在编写函数来printf系统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()调用的输出之外,还有一种更好的方法可以做到这一点。

再次编辑:上面的代码完全来自用户程序,但不能从内核函数中运行。任何人都知道为什么?:/

8 个答案:

答案 0 :(得分:3)

试着看看ps的作用。看看它的源代码;它知道有多少进程

答案 1 :(得分:3)

也许您可以向我们展示您为捕获system("ps -ax | wc -l")的结果所编写的代码,或者您编写的使用popen的代码,我们可以帮助您使用它来诊断问题。

无论如何,我能想到的最有效的方法是计算系统上现有(不同于正在运行)进程的数量是opendir("/proc")并计算十进制数字串的条目数。系统中的每个进程都将由/proc的子目录表示,该子目录以该进程的十进制进程ID号命名。

因此,如果您找到“/ proc / 3432”,那么您就知道存在一个pid为“3432”的进程。只需计算您找到的名称为十进制数的子目录的数量。

<小时/> 假设:

  • 您问的是Linux,而不是MINIX
  • 您正在编写用户模式程序,而不是修改内核。

答案 2 :(得分:2)

struct kinfo kinfo;
int nr_tasks, nr_procs;
getsysinfo(PM_PROC_NR, SI_KINFO, &kinfo);
nr_procs = kinfo.nr_pro;

这将为您提供正在运行的进程数

答案 3 :(得分:1)

所以我遇到了同样的问题并找到了解决方案。 (MINIX 3.1)在计算进程的方法中使用此代码: (这是ANSI C)

它只是运行进程表并计算进程数。

我知道这是一个老线程,但它可能在将来帮助某人。

#include "../pm/mproc.h"

/* inside function */

struct mproc *mp;
int i, n=0;

printf("Number of running processes:\n");

getsysinfo(PM_PROC_NR, SI_PROC_TAB, mproc);

for (i = 0; i<NR_PROCS; i++) {
    mp = &mprocs[i];
    if (mp->mp_pid == 0 && i != PM_PROCS_NR) continue;
    n++;   
}

printf("%d", n);

/* function end */

答案 4 :(得分:1)

我在大学也有同样的任务,所以如果有人将来需要,我会发布我的解决方案。我将Minix 3.3和VMware播放器用于虚拟机 在位置 / usr / src / minix / servers / pm pm 服务器中,有 glo.h 文件,其中包含pm使用的各种全局变量服务器。在该文件中,幸运的是一个名为 procs_in_use 的变量定义为EXTERN int procs_in_use;
系统调用中如此简单的printf("%d\n",procs_in_use);将显示当前正在运行的进程数。您可以通过在循环中间的用户空间程序中添加fork()函数来测试此问题。

再提一句:第一个回答是

struct kinfo kinfo;
int nr_tasks, nr_procs;
getsysinfo(PM_PROC_NR, SI_KINFO, &kinfo);
nr_procs = kinfo.nr_procs;

对我不起作用。 SI_KINFO不再存在,因此您应该使用SI_PROC_TABLE。此外,权限可能存在问题,因此您无法从常规系统调用中调用此函数。还有一个替代函数sys_getkinfo(&kinfo)可以从您的新系统调用中调用,并且将执行与上面相同的操作。问题是kinfo.nr_procs不会返回当前进程的数量,但是可以在操作系统中的最大用户进程数默认为256,并且可以在定义了NR_PROCS的文件中手动更改。另一方面,kinfo.nr_tasks将返回操作系统可以保存的最大内核进程数,默认为5。

答案 5 :(得分:0)

检查出来:http://procps.sourceforge.net/

它有很多小型公用事业公司做这些事情。这将是一个很好的学习经历:)我认为PS就在那里,因为pm100注意到了。

答案 6 :(得分:0)

如果您正在编辑内核,解决此问题的最有效方法是每次创建进程(即task_struct条目)时都保持计数(并确保每次进程终止时都减少计数) )。

你总是可以使用内置的宏遍历内核中的进程列表(但是它很昂贵,所以你应该尽量避免使用它):

struct task_struct *p;
unsigned int count = 0;
for_each_process(task) {
    count++;
}

答案 7 :(得分:0)

检查出来:http://sourceforge.net/p/readproc/code/ci/master/tree/

#include"read_proc.h"
int main(void)
{
     struct Root * root=read_proc();
     printf("%lu\n",root->len);
     return 0;
}