【问题标题】:where is fork's child process return value?fork 的子进程返回值在哪里?
【发布时间】:2019-04-22 15:01:46
【问题描述】:

为什么fork的返回值不是0?

我知道子进程make成功,那么fork返回值为0 但我试过如果返回值(pid) == 0 然后是printf 代码。不幸的是没有打印。

fork(void)
{
  int i, pid;
  struct proc *np;
  struct proc *curproc = myproc();

  // Allocate process.
  if((np = allocproc()) == 0){
    return -1;
  }

  // Copy process state from proc.
  if((np->pgdir = copyuvm(curproc->pgdir, curproc->sz)) == 0){
    kfree(np->kstack);
    np->kstack = 0;
    np->state = UNUSED;
    return -1;
  }
  np->sz = curproc->sz;
  np->parent = curproc;
  *np->tf = *curproc->tf;

  // Clear %eax so that fork returns 0 in the child.
  np->tf->eax = 0;

  for(i = 0; i < NOFILE; i++)
    if(curproc->ofile[i])
      np->ofile[i] = filedup(curproc->ofile[i]);
  np->cwd = idup(curproc->cwd);

  safestrcpy(np->name, curproc->name, sizeof(curproc->name));

  pid = np->pid;

  acquire(&ptable.lock);

  np->state = RUNNABLE;

  release(&ptable.lock);
  if(pid ==0)
    cprintf("child process made%d",pid); // why not print zero ..
  else
    cprintf("pid value is %d",pid); 
  return pid;
}

子进程制作成功,即fork()的返回值为0! (我在其他关于 fork() 的主要代码中进行了测试)例如)漫游的谷歌代码(foo.c)

但未检测到 pid 在 fork() 中为 0。 子进程构造时fork()的返回值0在哪里?

【问题讨论】:

    标签: linux fork ubuntu-14.04 xv6


    【解决方案1】:

    系统调用由调用它们的进程上下文执行。这意味着调用它们的进程将收到系统调用函数的返回值。 fork 实现与所有其他系统调用具有相同的行为,但有点特殊,因为虽然只有父进程实际调用了它,但应该有 2 个进程从它返回。

    正在构建子进程的堆栈以模拟先前进行的系统调用,以及存储在陷阱帧的 eax 寄存器(用于保存函数返回值)中的模拟返回值。

    当调度程序选择运行子进程时,运行的第一行代码将是forkret函数和trapret,因为模拟堆栈是由allocproc函数准备的。

    【讨论】:

      猜你喜欢
      • 2023-01-19
      • 2018-12-13
      • 2011-02-03
      • 1970-01-01
      • 2014-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-09
      相关资源
      最近更新 更多