我正在参加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)如何理解杀死单个进程的代码?代码做了什么?
我可能会问非常愚蠢的问题,但请帮助。
答案 0 :(得分:4)
1)pid是否手动设置为0和-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);
我可能会问非常愚蠢 问题,但请帮助。
内核代码非常明显(没有使用花哨的算法)。唯一的问题是它非常大,你需要耐心。