#c #kernel #xv6
#c #ядро #xv6
Вопрос:
Я пытаюсь реализовать системный вызов, называемый getprocs(), который возвращает количество фактических процессов. Я уже реализовал все необходимое для добавления нового системного вызова. Что делает этот системный вызов, так это получает процессы в таблице и копирует их в массив структур. Структура называется uproc, где ее членами являются int pid, int ppid и char name. Затем я создал программу в файле .c, которая пытается распечатать процессы в формате дерева, но у меня возникли проблемы с простой печатью имени процесса.Я не знаю, куда идти дальше. Ниже я приложил свой код, в котором я определяю getprocs() , структуру uproc и мою программу, которая пытается распечатать процессы. Я также включил ошибку, которую он выдает мне.
определение getprocs() в proc.c:
int
sys_getprocs(void)
{
int max;
struct uproc *p;
int i = 0;
argint(0, amp;max);
argptr(1, (char **)amp;p, max*sizeof(struct uproc));
struct proc *ptr = ptable.proc;
for(; ptr < amp;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 mainn");
int maxElements = 64;
struct uproc *processes = malloc(maxElements*sizeof(struct uproc));
int N = getprocs(maxElements, amp;processes);
int i = 0;
printf(10, "Startingn");
for(; i < N; i ) {
printf(16, processes[i].name);
}
return 0;
}
Ничто никогда не выводится на экран, и я получаю следующую ошибку после попытки запустить pstree:
pid 3 pstree: ошибка trap 14 4 на cpu 1 eip 0x6da addr 0x42444cb — процесс уничтожения
Комментарии:
1. Ваш
printf
действительно странный.2. если вы используете xv6, вы должны использовать cprintf. У меня нет доступа к документам xv6, но я просматриваю ловушку 14 и вижу, что вызывает команду kill
3. Я голосую за то, чтобы закрыть этот вопрос как не относящийся к теме, потому что это явно вопрос домашнего задания, и задающий его человек практически не работал над решением проблемы.
Ответ №1:
-
Для
sys_getprocs
, измените это…if(!(ptr->state == UNUSED)) { continue; }
Для…
if((ptr->state == UNUSED)) { continue; }
Потому что вы хотите получить все запущенные процессы.
-
В
main
, изменение…int N = getprocs(maxElements, amp;processes);
Для…
int N = getprocs(maxElements, processes);
поскольку процессы уже определены как указатель
Изменение этих двух частей вашего кода должно заставить программу работать.
Ответ №2:
Вы должны использовать exit() вместо return 0 . Это должно сработать.