где возвращаемое значение дочернего процесса fork? - PullRequest
0 голосов
/ 22 апреля 2019

почему бы не вернуть значение вилки 0?

Я знаю, что дочерний процесс завершился успешно, тогда возвращаемое значение вилки равно 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 ()) ex) roved google code (foo.c)

, но не обнаруженный pid равен 0 в fork ().где возвращаемое значение fork () 0 при создании дочернего процесса?

1 Ответ

0 голосов
/ 23 апреля 2019

Системные вызовы выполняются контекстом процесса, который их вызвал.Это означает, что процесс, который вызвал их, получит возвращаемое значение функции системного вызова.Реализация fork имеет то же поведение, что и все другие системные вызовы, но она немного особенная, потому что 2 процесса предположительно возвращаются из нее, хотя только родительский процесс фактически вызвал ее.

Стек дочернего процесса создается для имитации системыранее был сделан вызов, вместе с имитированным возвращаемым значением, хранящимся в регистре eax trapframe (который использовался для хранения возвращаемого значения функции).

Когда дочерний процесс выбран для запуска планировщиком, это первая строкакод, который будет выполняться, будет функцией forkret и будет интерпретироваться как подготовленный имитированный стек с помощью функции allocproc.

...