Minix系统上从C代码运行的进程数
所以,一开始这看起来很简单,但在谷歌和这里爬行之后,答案似乎不像我最初想的那么简单 基本上,我正在编辑一个MINIX内核,作为操作系统实践课程的一部分,我必须添加一个小函数,当你点击信息服务器中的一个函数键时,它会吐出正在运行的进程数。我已经知道了如何集成功能,以便所有其他功能都能正常工作,但就我的一生而言,我无法知道如何将系统中当前运行的进程数输入到我的C代码中并输出到一个变量中 首先,我认为会有一个漂亮的Syscall,比如SYS\u NUMPROCS,或者会返回值的东西,但是没有运气。 然后,我尝试将系统的输出(“ps-ax | wc-l”)管道化到一个文件,但该文件无法创建。我尝试过使用popen(),但也没有成功——即使在缓冲区中读取一个简单的“ls”,它也会轰炸代码并“挂起”代码的运行,因此没有输出 所以现在我真的被难住了,任何帮助都会非常棒,因为在这一点上,我已经用尽了所有明显的选择 我现在唯一能想到的两件事是循环计算所有进程,但首先你必须进入系统的进程列表,我听到过关于/proc/作为目录的模糊说法,但我不知道如何访问/运行它,或者它如何与首先获得进程数目的联系起来 谢谢一堆(笑双关),伙计们:) 此外,我没有明确地包含代码,因为除了化妆品输出的基本打印之外,我没有写任何东西,因为我尝试过的任何东西都没有给我带来任何乐趣:/ 编辑说明:伙计们,这是一个内核编辑-我正在编写一个函数,将信息打印到SystemC文件中,然后重新编译内核并重新启动系统进行测试。它是UNIX(MINIX)内核,不是Linux内核,也不是用户模式程序 正如你们中的一些人所要求的,我的popen()代码如下:Minix系统上从C代码运行的进程数,c,unix,process,minix,C,Unix,Process,Minix,所以,一开始这看起来很简单,但在谷歌和这里爬行之后,答案似乎不像我最初想的那么简单 基本上,我正在编辑一个MINIX内核,作为操作系统实践课程的一部分,我必须添加一个小函数,当你点击信息服务器中的一个函数键时,它会吐出正在运行的进程数。我已经知道了如何集成功能,以便所有其他功能都能正常工作,但就我的一生而言,我无法知道如何将系统中当前运行的进程数输入到我的C代码中并输出到一个变量中 首先,我认为会有一个漂亮的Syscall,比如SYS\u NUMPROCS,或者会返回值的东西,但是没有运气。 然
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()调用的输出外,还必须有更好的方法来实现这一点
再次编辑:上面的代码在用户程序中运行良好,但在内核函数中无法运行。有人知道为什么吗?:/试着看看ps是做什么的。看看它的源代码;它知道有多少进程也许您可以向我们展示您为捕获
系统的结果而编写的代码(“ps-ax | wc-l”)
,或者您为使用popen
而编写的代码,我们可以帮助您诊断问题
无论如何,我能想到的计算系统上现有(与正在运行的)进程数的最有效的方法是计算十进制数字字符串的条目数。系统中的每个进程将由的子目录表示,以该进程的十进制进程id号命名
例如,如果您找到“/proc/3432”,那么您就知道存在一个pid为“3432”的进程。只需计算名称为十进制数的子目录数
假设:
- 你问的是什么,不是什么
- 您正在编写用户模式程序,而不是修改内核
它有许多做这类事情的小型实用程序的来源。这将是一个很好的学习体验:)我认为PS就在那里,正如pm100所指出的。如果您正在编辑内核,解决此问题的最有效方法是在每次创建进程(即任务结构条目)时维护一个计数(并确保每次进程终止时都减少计数) 您可以始终使用内置宏遍历内核中的进程列表(但代价很高,因此应尽量避免):
这将获得正在运行的进程数,因此我遇到了相同的问题并找到了解决方案。(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 */
#包括“./pm/mproc.h”
/*内部功能*/
结构mproc*mp;
int i,n=0;
printf(“正在运行的进程数:\n”);
getsysinfo(PM_PROC_n r,SI_PROC_TAB,mproc);
对于(i=0;imp\u pid==0&&i!=PM\u PROCS\u NR)继续;
n++;
}
printf(“%d”,n);
/*功能端*/
查看以下内容:
我在大学里也有同样的任务,所以如果将来有人需要,我会发布我的解决方案。我正在为虚拟机使用Minix 3.3和VMware player。
在位于/usr/src/minix/servers/pm位置的pm服务器中,有一个glo.h文件,其中包含pm服务器使用的各种全局变量。在该文件中,幸运的是有一个名为procs\u In_use的变量定义为
EXTERN int procs\u In_use代码>
非常简单的printf(“%d\n”,procs\u in\u use)来自系统调用的代码>将显示当前正在运行的进程数。可以通过在循环中的用户空间程序中添加<代码> FoK()/<代码>函数来测试这一点。
再提一句:第一个答案是
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\u getkinfo(&kinfo)
,可以从新的系统调用中调用,它将执行与上述相同的操作。问题是kinfo。nr_procs
不会返回当前进程的编号
#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 */
#include"read_proc.h"
int main(void)
{
struct Root * root=read_proc();
printf("%lu\n",root->len);
return 0;
}
struct kinfo kinfo;
int nr_tasks, nr_procs;
getsysinfo(PM_PROC_NR, SI_KINFO, &kinfo);
nr_procs = kinfo.nr_procs;