Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Minix系统上从C代码运行的进程数_C_Unix_Process_Minix - Fatal编程技术网

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

Minix系统上从C代码运行的进程数,c,unix,process,minix,C,Unix,Process,Minix,所以,一开始这看起来很简单,但在谷歌和这里爬行之后,答案似乎不像我最初想的那么简单 基本上,我正在编辑一个MINIX内核,作为操作系统实践课程的一部分,我必须添加一个小函数,当你点击信息服务器中的一个函数键时,它会吐出正在运行的进程数。我已经知道了如何集成功能,以便所有其他功能都能正常工作,但就我的一生而言,我无法知道如何将系统中当前运行的进程数输入到我的C代码中并输出到一个变量中 首先,我认为会有一个漂亮的Syscall,比如SYS\u NUMPROCS,或者会返回值的东西,但是没有运气。 然

所以,一开始这看起来很简单,但在谷歌和这里爬行之后,答案似乎不像我最初想的那么简单

基本上,我正在编辑一个MINIX内核,作为操作系统实践课程的一部分,我必须添加一个小函数,当你点击信息服务器中的一个函数键时,它会吐出正在运行的进程数。我已经知道了如何集成功能,以便所有其他功能都能正常工作,但就我的一生而言,我无法知道如何将系统中当前运行的进程数输入到我的C代码中并输出到一个变量中

首先,我认为会有一个漂亮的Syscall,比如SYS\u NUMPROCS,或者会返回值的东西,但是没有运气。 然后,我尝试将系统的输出(“ps-ax | wc-l”)管道化到一个文件,但该文件无法创建。我尝试过使用popen(),但也没有成功——即使在缓冲区中读取一个简单的“ls”,它也会轰炸代码并“挂起”代码的运行,因此没有输出

所以现在我真的被难住了,任何帮助都会非常棒,因为在这一点上,我已经用尽了所有明显的选择

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

谢谢一堆(笑双关),伙计们:)

此外,我没有明确地包含代码,因为除了化妆品输出的基本打印之外,我没有写任何东西,因为我尝试过的任何东西都没有给我带来任何乐趣:/

编辑说明:伙计们,这是一个内核编辑-我正在编写一个函数,将信息打印到SystemC文件中,然后重新编译内核并重新启动系统进行测试。它是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()调用的输出外,还必须有更好的方法来实现这一点


再次编辑:上面的代码在用户程序中运行良好,但在内核函数中无法运行。有人知道为什么吗?:/

试着看看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;