Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 叉子在哪里;s子进程返回值?_Linux_Fork_Ubuntu 14.04_Xv6 - Fatal编程技术网

Linux 叉子在哪里;s子进程返回值?

Linux 叉子在哪里;s子进程返回值?,linux,fork,ubuntu-14.04,xv6,Linux,Fork,Ubuntu 14.04,Xv6,为什么fork的返回值不为0 我知道子进程成功,那么fork返回值是0 但是我尝试了如果返回值(pid)==0,那么printfcode。不幸的是,没有印刷 fork(void) { int i, pid; struct proc *np; struct proc *curproc = myproc(); // Allocate process. if((np = allocproc()) == 0){ return -1; } // Copy proce

为什么fork的返回值不为0

我知道子进程成功,那么fork返回值是0 但是我尝试了如果返回值
(pid)==0,那么
printf
code。不幸的是,没有印刷

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(无效)
{
inti,pid;
struct-proc*np;
struct proc*curproc=myproc();
//分配过程。
如果((np=allocproc())==0){
返回-1;
}
//从进程复制进程状态。
如果((np->pgdir=copyuvm(curproc->pgdir,curproc->sz))==0){
kfree(np->kstack);
np->kstack=0;
np->状态=未使用;
返回-1;
}
np->sz=curproc->sz;
np->parent=curproc;
*np->tf=*curproc->tf;
//清除%eax,使fork在子级中返回0。
np->tf->eax=0;
对于(i=0;iofile[i])
np->ofile[i]=filedup(curproc->ofile[i]);
np->cwd=idup(curproc->cwd);
安全复制(np->name,curproc->name,sizeof(curproc->name));
pid=np->pid;
获取(&ptable.lock);
np->state=RUNNABLE;
释放(&ptable.lock);
如果(pid==0)
cprintf(“子进程生成%d”,pid);//为什么不打印零。。
其他的
cprintf(“pid值为%d”,pid);
返回pid;
}
child proecss making successful,即fork()的返回值为0!(我在关于fork()的其他主代码中进行了测试)ex)已批准的google代码(foo.c)

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

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

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

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