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

问题描述 投票:0回答:1

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

补充:我们可能需要增加一个系统调用来决定是否使用这个顺序。

fork xv6
1个回答
1
投票

自问自答,如何 滑稽!

  • 首先,添加一个系统调用 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中添加一个用户程序。

谢谢您的时间!

© www.soinside.com 2019 - 2024. All rights reserved.