我看到了很多相关的问题和回答,但是,没有人能提供一个好的解决方案,你能帮帮我吗?
补充:我们可能需要增加一个系统调用来决定是否使用这个顺序。
自问自答,如何 滑稽!
int fork_winner(int winner)
其中需要一个整数参数。如果 winner == 1
,子进程先运行。如果 winner == 0
,家长像往常一样先运行。要实现这一点,你可能需要以下方面的帮助。定义 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中添加一个用户程序。
谢谢您的时间!