微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在这种情况下,进程是不是总是无法被杀死?

如何解决在这种情况下,进程是不是总是无法被杀死?

问题涉及代码比较碎片化,这里我给出主要代码

完整代码syscall.c

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;
  }
}

完整代码sysproc.c

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);
}

完整代码proc.c

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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?