我正在使用OS161,并且在process.c
中有一段类似于以下代码:
void
process_exit(int exit_code)
{
splhigh();
curthread->p_process->exited_flag = 1; // Process exited
curthread->p_process->exit_code = exit_code;
struct process * process;
// Now all the child process will be orphant, we need to adopt them
// Search through the process table, change all children's ppid
for (int i = 0; i < array_getnum(process_table); i++) {
*process = array_getguy(process_table, i);
if (process != NULL && process->ppid == curthread->p_process->pid) { // We found a child here, it should be a orphant now
process->ppid = 1; // Now the init(boot/menu) process should adopt the child process
process->adopted_flag = 1;
}
}
V(curthread->p_process->sem_exit); // Now signal processes which are waiting
// Now exit the thread
thread_exit();
}
过程结构的定义:
struct process{
char* process_name;
struct addrspace *process_vmspace;
struct vnode *process_cwd;
pid_t pid;
pid_t ppid;
int adopted_flag;
int exited_flag;
int exit_code;
struct thread *p_thread;
struct semaphore *sem_exit;
};
我收到END OF FILE
错误,GDB告诉我这是定义process_exit
的地方。我对OS编程不是很熟悉,有人知道为什么会这样吗?
编辑:这是GDB消息:
panic: Fatal exception 3 (TLB miss on store) in kernel mode
panic: EPC 0x8001a008, exception vaddr 0x18
sleep: Dropping thread <boot/menu>
panic: I can't handle this... I think I'll just die now...
我做了gdb list *0x8001a008
,它指向curthread->p_process->exited_flag = 1;
。
给出@ctx的分析,请尝试下面的代码来证明我们是否处在正确的轨道上:
void
process_exit(int exit_code)
{
splhigh();
if (curthread && curthread->p_process)
{
curthread->p_process->exited_flag = 1; // Process exited
curthread->p_process->exit_code = exit_code;
}
// same code as before below here ...