Linux 叉子在哪里;s子进程返回值?
为什么fork的返回值不为0 我知道子进程成功,那么fork返回值是0 但是我尝试了如果返回值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
(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函数准备的