Сам спрашивай, сам отвечай, как смешно !
- Сначала добавь системный вызов
int fork_winner(int winner)
, для которого нужен целочисленный аргумент. Если winner == 1
, дочерний процесс запускается первым. Если winner == 0
, родитель запускается первым как обычно. Для этого вам может понадобиться помощь:
1. как добавить системный вызов / утилиту в xv6
2. как передать значение в функцию системного вызова в xv6
Определение int sys_fork_winner(void)
выглядит следующим образом: sysproc.c
:
int
sys_fork_winner(void)
{
if(argint(0, &child_first) < 0) // fetch parameter
return -1;
return 0;
}
Во-вторых, установите глобальную переменную, например, child_first
, чтобы сохранить значение winner
.
В-третьих, измените fork()
в proc.c
. если winner == 1
, вызовите yield()
после создания дочернего процесса. В противном случае ничего не делать.
Наконец, вам может понадобиться пользовательская программа для проверки ее работоспособности. Основной код следующий:
void test(){
int i = 0;
int ret = 0;
for (i = 0; i < TOTAL_TEST_TRIALS; i++)
{
printf(1, "\nTrial %d: ", i);
ret = fork();
if (ret < 0)
{
printf(1, "fork() failed (%d)\n", ret);
exit();
}
else if (ret == 0) // child
{
printf(1, " child! ");
exit();
}
// parent
printf(1, " parent! ");
if (ret != wait())
{
printf(1, "wait() failed!\n");
}
}
printf(1, "\n");
}
int
main(int argc, char *argv[])
{
printf(1,"Fork test\nSet child as winner");
fork_winner(1);
test();
printf(1,"\nSet parent as winner");
fork_winner(0);//the default
test();
exit();
}
Эта статья может помочь вам добавить пользовательскую программу в xv6.
Спасибо за ваше время !