我想实现一个系统调用,被称为getprocs()返回实际的进程的数量。我已经实现了所有的必需品添加新的系统调用。这是什么系统调用的作用是获得表,并将它们复制的流程,以结构的数组。该结构被称为uproc,在其成员INT PID,INT PPID和char名。然后,我已经创造了交流转换器文件中的程序,试图打印进程树的格式,但我有麻烦刚打印过程name.I不知道从哪里何去何从。下面我重视我的代码,我定义getprocs(),该结构uproc,我的计划,试图打印的过程。我还包括它抛出我的错误。
getprocs()的定义中proc.c:
int
sys_getprocs(void)
{
int max;
struct uproc *p;
int i = 0;
argint(0, &max);
argptr(1, (char **)&p, max*sizeof(struct uproc));
struct proc *ptr = ptable.proc;
for(; ptr < &ptable.proc[NPROC]; ptr++) {
if(!(ptr->state == UNUSED)) {
continue;
}
p[i].pid = ptr->pid;
p[i].ppid = ptr->parent->pid;
strncpy(p[i].name, ptr->name, 16);
i++;
}
return i;
}
结构uproc在uproc.h:
struct uproc {
int pid;
int ppid;
char name[16];
};
程序试图在pstree.c打印过程:
#include "types.h"
#include "stat.h"
#include "user.h"
#include "uproc.h"
int main() {
printf(20, "Made it into main\n");
int maxElements = 64;
struct uproc *processes = malloc(maxElements*sizeof(struct uproc));
int N = getprocs(maxElements, &processes);
int i = 0;
printf(10, "Starting\n");
for(; i < N; i++) {
printf(16, processes[i].name);
}
return 0;
}
没有什么是打印在屏幕上,我试图运行pstree后收到以下错误:
PID 3 pstree:陷阱14 ERR 4上CPU 1 EIP 0x6da地址0x42444cb - 杀PROC
sys_getprocs
,改变...
if(!(ptr->state == UNUSED)) {
continue;
}
至...
if((ptr->state == UNUSED)) {
continue;
}
因为过程已定义为一个指针改变你的代码的这两部分应该使工作方案。
给1为printf的第一个参数。
e.g:
main
这就像在UNIX fprintf中,你需要给它的文件描述符。图1是标准输出。
我对陷阱最好的猜测是,当printf的尝试找到端口10或20,它访问映射的内存,你得到捕获器14,这是一个页缺失的代码。
您应该使用退出(),而不是返回0。它应该工作。