我已经看到很多相关的问题和答复,但是没有人能提供一个好的解决方案,您能帮我吗?
添加:我们可能需要添加系统调用来确定是否使用此订单。
答案 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。
谢谢您的时间!