В xv6, как я могу заставить дочерний процесс запускаться первым после fork ()? - PullRequest
1 голос
/ 25 апреля 2020

Я видел множество связанных вопросов и ответов, однако никто не может предложить хорошее решение, не могли бы вы мне помочь?

Добавить: нам может потребоваться добавить системный вызов, чтобы определить, следует ли использовать этот заказ или нет.

1 Ответ

1 голос
/ 25 апреля 2020

Сам спрашивай, сам отвечай, как смешно !

  • Сначала добавь системный вызов 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.

Спасибо за ваше время !

...