struct proc proc[NPROC];
struct proc *curproc[NCPU];
+static struct proc *initproc;
+
int nextpid = 1;
extern void forkret(void);
extern void forkret1(struct trapframe*);
p->tf->eflags = FL_IF;
p->tf->esp = p->sz;
- // Push dummy return address to placate gcc.
+ // Make return address readable; needed for some gcc.
p->tf->esp -= 4;
*(uint*)(p->mem + p->tf->esp) = 0xefefefef;
memmove(p->mem, _binary_initcode_start, (int)_binary_initcode_size);
safestrcpy(p->name, "initcode", sizeof(p->name));
p->state = RUNNABLE;
+
+ initproc = p;
}
//PAGEBREAK: 42
struct proc *p;
int fd;
- if(cp->pid == 1)
+ if(cp == initproc)
panic("init exiting");
// Close all open files.
acquire(&proc_table_lock);
- // Wake up our parent.
+ // Wake up waiting parent.
for(p = proc; p < &proc[NPROC]; p++)
if(p->pid == cp->ppid)
wakeup1(p);
- // Reparent our children to process 1.
- for(p = proc; p < &proc[NPROC]; p++)
+ // Pass abandoned children to init.
+ for(p = proc; p < &proc[NPROC]; p++){
if(p->ppid == cp->pid){
- p->ppid = 1;
- wakeup1(&proc[1]); // init
+ p->ppid = initproc->pid;
+ if(p->state == ZOMBIE)
+ wakeup1(initproc);
}
+ }
// Jump into the scheduler, never to return.
cp->killed = 0;