FreeBSD kill(2)实现

时间:2011-06-30 06:39:59

标签: system freebsd kernel system-calls

我正在参加FreeBSD课程并正在阅读系统调用kill(2)的实现。

http://fxr.watson.org/fxr/source/kern/kern_sig.c?v=FREEBSD82#L1687

部分代码:

 1717         switch (uap->pid) {
 1718         case -1:                /* broadcast signal */
 1719                 return (killpg1(td, uap->signum, 0, 1, &ksi));
 1720         case 0:                 /* signal own process group */
 1721                 return (killpg1(td, uap->signum, 0, 0, &ksi));
 1722         default:                /* negative explicit process group */
 1723                 return (killpg1(td, uap->signum, -uap->pid, 0, &ksi));
 1724         }
 1725         /* NOTREACHED */
 1726 }

1)pid是否在调用系统调用时手动设置为0和-1以指示进程组或sth?

2)为什么“signum”会介入?

3)如何理解杀死单个进程的代码?代码做了什么?

我可能会问非常愚蠢的问题,但请帮助。

1 个答案:

答案 0 :(得分:4)

  

1)pid是否手动设置为0和-1   表示进程组或某事   什么时候打电话给系统?

  • 如果pid为0,则发送信号 同一过程中的所有过程 组作为发件人。
  • 如果pid为-1,则发送信号 给每个人(包括发件人)。 发件人必须具有权限 此。
  

2)为什么“signum”会介入?

  • signum是发送的信号。那里 有很多不同的信号 东西;试试kill -l
  3)如何理解代码   杀死一个过程?什么是   代码呢?

首先搜索该进程,如果找不到它,则返回ESRCH(例如,如果您尝试向某些不存在的pid发送信号)。

if ((p = pfind(uap->pid)) == NULL) {
    if ((p = zpfind(uap->pid)) == NULL)
    return (ESRCH);
}

检查是否允许我们发信号(带有该信号):

error = p_cansignal(td, p, uap->signum);

如果我们 允许发信号,则会发送pksignal (tdsignal)

if (error == 0 && uap->signum)
    pksignal(p, uap->signum, &ksi);

现在我们需要从函数返回所以我们应该放下锁

PROC_UNLOCK(p);
    return (error);
  

我可能会问非常愚蠢   问题,但请帮助。

内核代码非常明显(没有使用花哨的算法)。唯一的问题是它非常大,你需要耐心。