実際のプロセスの数を返すgetprocs()というシステムコールを実装しようとしています。私はすでに新しいシステムコールを追加するためのすべての必要性を実装しました。このシステムコールは、テーブル内のプロセスを取得し、それらを構造体の配列にコピーします。構造体はuprocと呼ばれ、メンバーはint pid、int ppid、およびchar nameです。その後、プロセスをツリー形式で印刷しようとするプログラムをa.cファイルに作成しましたが、プロセス名を印刷するだけでは問題があります。ここからどこに行くのかはわかりません。以下では、私がgetprocs()、構造体uproc、およびプロセスを印刷しようとするプログラムを定義する私のコードを添付しました。私はそれが私に投げるエラーも含めた。xv6でsyscallを実装する
getprocs()proc.cで定義:uproc.hで
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:pstree.cの処理を印刷しようと
struct uproc {
int pid;
int ppid;
char name[16];
};
プログラム:
#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コマンド:CPU 1にトラップ14 ERR 4 EIP 0x6da ADDR 0x42444cb -
あなたの 'printf'は本当に変です。 – user58697
xv6を使用している場合は、cprintfを使用する必要があります。私はxv6のドキュメントにはアクセスできないが、トラップ14を参照してkillコマンドの原因を調べる – Turtle