我看到了很多相关的问题和回答,但没有人能提供一个好的解决方案,你能帮我吗?
添加:我们可能需要添加一个系统调用来确定是否使用此顺序。
自我提问,自我回答,多么有趣!
- 首先,添加一个需要整数参数的系统调用
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);
}