如何解决在这种情况下,进程是不是总是无法被杀死?
static uint64
argraw(int n)
{
struct proc *p = myproc();
switch (n) {
case 0:
return p->tf->a0;
case 1:
return p->tf->a1;
case 2:
return p->tf->a2;
case 3:
return p->tf->a3;
case 4:
return p->tf->a4;
case 5:
return p->tf->a5;
}
panic("argraw");
return -1;
}
// Fetch the nth 32-bit system call argument.
int
argint(int n,int *ip)
{
*ip = argraw(n);
return 0;
}
....
....
static uint64 (*syscalls[])(void) = {
[SYS_fork] sys_fork,[SYS_exit] sys_exit,[SYS_wait] sys_wait,[SYS_pipe] sys_pipe,[SYS_read] sys_read,[SYS_kill] sys_kill,[SYS_exec] sys_exec,[SYS_fstat] sys_fstat,[SYS_chdir] sys_chdir,[SYS_dup] sys_dup,[SYS_getpid] sys_getpid,[SYS_sbrk] sys_sbrk,[SYS_sleep] sys_sleep,[SYS_uptime] sys_uptime,[SYS_open] sys_open,[SYS_write] sys_write,[SYS_mknod] sys_mknod,[SYS_unlink] sys_unlink,[SYS_link] sys_link,[SYS_mkdir] sys_mkdir,[SYS_close] sys_close,[SYS_ntas] sys_ntas,};
....
....
void
syscall(void)
{
int num;
struct proc *p = myproc();
num = p->tf->a7;
if(num > 0 && num < NELEM(syscalls) && syscalls[num]) {
p->tf->a0 = syscalls[num](); // question here
} else {
printf("%d %s: unkNown sys call %d\n",p->pid,p->name,num);
p->tf->a0 = -1;
}
}
uint64
sys_exit(void)
{
int n;
if(argint(0,&n) < 0)
return -1;
exit(n);
return 0; // not reached
}
uint64
sys_kill(void)
{
int pid;
if(argint(0,&pid) < 0)
return -1;
return kill(pid);
}
int
kill(int pid)
{
struct proc *p;
for(p = proc; p < &proc[NPROC]; p++){
acquire(&p->lock);
if(p->pid == pid){
p->killed = 1;
if(p->state == SLEEPING){
// Wake process from sleep().
p->state = RUNNABLE;
}
release(&p->lock);
return 0;
}
release(&p->lock);
}
return -1;
}
对于p->tf->a0 = syscalls[num]();
(在syscall.c中),调用这行代码后,p->tf->a0
的值会发生变化,
如您所见,sys_exit()
返回的是 0 或 -1,sys_fork()
可能返回 pid 或 -1(fork()
在函数 sys_fork()
中)。
这样它存储的值可能不再是pid
,而是其他函数的返回值。
我的问题:
由上可知,调用sys_kill()
时,函数中argint()
得到的值可能不是进程的pid
,
所以kill()的参数可能不是进程的pid。
这种情况下,进程不是一直杀不死吗?
解决方法
正如你所指出的,有问题的一行是:
p->tf->a0 = syscalls[num]();
当编译器看到这一行时,会发生什么?你可以分两步分解:
uint64 ret;
ret = syscalls[num]();
p->tf->a0 = ret;
换句话说,p->tf->a0
在被 sys_kill
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。