Number of Running Processes on a Minix system from C code

前端 未结 8 1012
盖世英雄少女心
盖世英雄少女心 2021-01-03 06:14

So, this seemed simple at first, but after crawling Google and here, the answer doesn\'t seem as simple as I first thought.

Basically, I\'m editing a MINIX kernel as

相关标签:
8条回答
  • 2021-01-03 07:08

    I had the same assignment at my university so i will post my solution if someone needs it in future. I am using Minix 3.3 and VMware player for virtual machines.
    In pm server at location /usr/src/minix/servers/pm there is glo.h file which contains various global variables used by pm server. In that file, there is fortunately one variable called procs_in_use defined as EXTERN int procs_in_use;
    So simple printf("%d\n",procs_in_use); from a system call will show the number of current processes running. You can test this by adding fork() function in your user space program in the middle of a loop.

    One more mention : first answer that says

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

    didn't work out for me. SI_KINFO no more exists so you should use SI_PROC_TABLE. Also there can be problems with permissions, so you will not be able to call this function from your regular system call. There is alternative function sys_getkinfo(&kinfo) that can be called from your fresh system call and that will do the same as the above. The problem is kinfo.nr_procs will not return number of current processes but number of maximum user processes that can be in operative system which is 256 by default, and can be changed manually in file where NR_PROCS is defined. On the other hand kinfo.nr_taskswill return maximum number of kernel processes that can be held by operative system, which is 5 by default.

    0 讨论(0)
  • 2021-01-03 07:09

    If you're editing the kernel, the most efficient way to solve this problem is to maintain a count every time a process (i.e., a task_struct entry) is created (and make sure you decrement the count every where a process terminates).

    You could always loop through the list of processes in the kernel using the built-in macro (but its expensive, so you should try to avoid it):

    struct task_struct *p;
    unsigned int count = 0;
    for_each_process(task) {
        count++;
    }
    
    0 讨论(0)
提交回复
热议问题