系统调用以计算进程中的子进程数
System call to count number of children in a process
我已经完成了创建系统调用的所有步骤,然后创建了一个用户程序并运行它:
proc.c
int countChildren (int pid) {
struct proc *p;
int count = 0;
acquire(&ptable.lock);
for(p = ptable.proc; p < &ptable.proc[NPROC]; p++)
if(p->parent->pid == pid) count++;
release(&ptable.lock);
return count;
}
系统proc.c
int
sys_getchildren(void)
{
int pid;
argint(0, &pid);
return countChildren(pid);
}
userProgram.c
...
#include "types.h"
#include "user.h"
int main (void) {
int n1 = fork();
int n2 = fork();
int n3 = fork();
int n4 = fork();
if (n1 > 0 && n2 > 0 && n3 > 0 && n4 > 0) {
printf(1,"parent\n");
printf(1," getchildren = %d \n", getchildren());
}
exit();
}
但是结果不是我想要的,下面是结果:
我认为您的内核代码已更正,您的问题来自用户代码:
你创建了进程,但你没有照顾它们,所以它们变成了僵尸,无法计算。
当一个进程退出并且没有被它的父进程等待时,它变成僵尸:
zombie 是被 init 进程采用的进程(参见文件 proc.c
中的 exit
定义)并且不能算作子进程。
要更正您的测试代码,请让进程休眠一段时间并等待它们的子进程:
#include "types.h"
#include "user.h"
int main (void) {
int n1 = fork();
int n2 = fork();
int n3 = fork();
int n4 = fork();
if (n1 > 0 && n2 > 0 && n3 > 0 && n4 > 0) {
printf(1,"parent\n");
printf(1," getchildren = %d \n", getchildren());
}
/* wait for all child to terminate */
while(wait() != -1) { }
/* give time to parent to reach wait clause */
sleep(1);
exit();
}
编辑:你在系统调用中有一点错字,而不是 getint
你应该从 myproc
:
得到 pid
int
sys_getchildren(void)
{
int pid;
pid = myproc()->pid;
return countChildren(pid);
}
或更短:
int
sys_getchildren(void)
{
return countChildren(myproc()->pid);
}
我已经完成了创建系统调用的所有步骤,然后创建了一个用户程序并运行它:
proc.c
int countChildren (int pid) {
struct proc *p;
int count = 0;
acquire(&ptable.lock);
for(p = ptable.proc; p < &ptable.proc[NPROC]; p++)
if(p->parent->pid == pid) count++;
release(&ptable.lock);
return count;
}
系统proc.c
int
sys_getchildren(void)
{
int pid;
argint(0, &pid);
return countChildren(pid);
}
userProgram.c
...
#include "types.h"
#include "user.h"
int main (void) {
int n1 = fork();
int n2 = fork();
int n3 = fork();
int n4 = fork();
if (n1 > 0 && n2 > 0 && n3 > 0 && n4 > 0) {
printf(1,"parent\n");
printf(1," getchildren = %d \n", getchildren());
}
exit();
}
但是结果不是我想要的,下面是结果:
我认为您的内核代码已更正,您的问题来自用户代码: 你创建了进程,但你没有照顾它们,所以它们变成了僵尸,无法计算。
当一个进程退出并且没有被它的父进程等待时,它变成僵尸:
zombie 是被 init 进程采用的进程(参见文件 proc.c
中的 exit
定义)并且不能算作子进程。
要更正您的测试代码,请让进程休眠一段时间并等待它们的子进程:
#include "types.h"
#include "user.h"
int main (void) {
int n1 = fork();
int n2 = fork();
int n3 = fork();
int n4 = fork();
if (n1 > 0 && n2 > 0 && n3 > 0 && n4 > 0) {
printf(1,"parent\n");
printf(1," getchildren = %d \n", getchildren());
}
/* wait for all child to terminate */
while(wait() != -1) { }
/* give time to parent to reach wait clause */
sleep(1);
exit();
}
编辑:你在系统调用中有一点错字,而不是 getint
你应该从 myproc
:
pid
int
sys_getchildren(void)
{
int pid;
pid = myproc()->pid;
return countChildren(pid);
}
或更短:
int
sys_getchildren(void)
{
return countChildren(myproc()->pid);
}