在xv6中,如何让子进程在fork()之后首先运行?

时间:2020-04-25 02:50:30

标签: fork xv6

我已经看到很多相关的问题和答复,但是没有人能提供一个好的解决方案,您能帮我吗?

添加:我们可能需要添加系统调用来确定是否使用此订单。

1 个答案:

答案 0 :(得分:1)

自我问问,自我回答,如何有趣

  • 首先,添加一个需要整数参数的系统调用int fork_winner(int winner)。如果为winner == 1,则子进程首先运行。如果winner == 0,则父级像往常一样先运行。为此,您可能需要以下方面的帮助:

1. how do i add a system call / utility in xv6

2. how to pass a value into a system call function in 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();
}

article可以帮助您将用户程序添加到xv6。

谢谢您的时间!