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



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

添加:我们可能需要添加一个系统调用来确定是否使用此顺序。

自我提问,自我回答,多么有趣!

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

/emsp 1.如何在xv6 中添加系统调用/实用程序

 emsp;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的值。

  • 第三,修改proc.c中的fork()。如果是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 testnSet child as winner");
fork_winner(1);  
test();
printf(1,"nSet parent as winner");
fork_winner(0);//the default
test();

exit();
}

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

感谢您抽出时间!

这是示例代码,一种方法是在fork((之后使用wait-sys调用;这将使父进程等待,直到子进程完成

#include "kernel/types.h"
#include "user/user.h"
int main(void) {

int status;
int pid = fork();
wait(&status);

if (pid < 0) {
printf("Fork failedn");
} else if (pid == 0) {
int pid = getpid();
printf("child PID: %d n", pid);
exit(0);
} else {
int cid = getpid();
printf("Parent ID : %dn", cid);

}

exit(0);

}

最新更新