version 1.1.1.2, 2018/04/24 18:01:35
|
version 1.1.1.3, 2018/04/24 18:02:23
|
Line 94 static void tell_father(int pid)
|
Line 94 static void tell_father(int pid)
|
return; |
return; |
} |
} |
/* if we don't find any fathers, we just release ourselves */ |
/* if we don't find any fathers, we just release ourselves */ |
|
/* This is not really OK. Must change it to make father 1 */ |
|
printk("BAD BAD - no father found\n\r"); |
release(current); |
release(current); |
} |
} |
|
|
Line 104 int do_exit(long code)
|
Line 106 int do_exit(long code)
|
free_page_tables(get_base(current->ldt[1]),get_limit(0x0f)); |
free_page_tables(get_base(current->ldt[1]),get_limit(0x0f)); |
free_page_tables(get_base(current->ldt[2]),get_limit(0x17)); |
free_page_tables(get_base(current->ldt[2]),get_limit(0x17)); |
for (i=0 ; i<NR_TASKS ; i++) |
for (i=0 ; i<NR_TASKS ; i++) |
if (task[i] && task[i]->father == current->pid) |
if (task[i] && task[i]->father == current->pid) { |
task[i]->father = 0; |
task[i]->father = 1; |
|
if (task[i]->state == TASK_ZOMBIE) |
|
/* assumption task[1] is always init */ |
|
(void) send_sig(SIGCHLD, task[1], 1); |
|
} |
for (i=0 ; i<NR_OPEN ; i++) |
for (i=0 ; i<NR_OPEN ; i++) |
if (current->filp[i]) |
if (current->filp[i]) |
sys_close(i); |
sys_close(i); |
Line 113 int do_exit(long code)
|
Line 119 int do_exit(long code)
|
current->pwd=NULL; |
current->pwd=NULL; |
iput(current->root); |
iput(current->root); |
current->root=NULL; |
current->root=NULL; |
|
iput(current->executable); |
|
current->executable=NULL; |
if (current->leader && current->tty >= 0) |
if (current->leader && current->tty >= 0) |
tty_table[current->tty].pgrp = 0; |
tty_table[current->tty].pgrp = 0; |
if (last_task_used_math == current) |
if (last_task_used_math == current) |
Line 133 int sys_exit(int error_code)
|
Line 141 int sys_exit(int error_code)
|
|
|
int sys_waitpid(pid_t pid,unsigned long * stat_addr, int options) |
int sys_waitpid(pid_t pid,unsigned long * stat_addr, int options) |
{ |
{ |
int flag; |
int flag, code; |
struct task_struct ** p; |
struct task_struct ** p; |
|
|
verify_area(stat_addr,4); |
verify_area(stat_addr,4); |
Line 164 repeat:
|
Line 172 repeat:
|
current->cutime += (*p)->utime; |
current->cutime += (*p)->utime; |
current->cstime += (*p)->stime; |
current->cstime += (*p)->stime; |
flag = (*p)->pid; |
flag = (*p)->pid; |
put_fs_long((*p)->exit_code,stat_addr); |
code = (*p)->exit_code; |
release(*p); |
release(*p); |
|
put_fs_long(code,stat_addr); |
return flag; |
return flag; |
default: |
default: |
flag=1; |
flag=1; |