【问题标题】:FreeBSD kill(2) implementationFreeBSD kill(2) 实现
【发布时间】:2011-09-25 17:32:12
【问题描述】:

我正在学习 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表示进程组或某事?

2) 为什么“signum”会参与进来?

3) 如何理解杀死单个进程的代码?代码有什么作用?

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

【问题讨论】:

    标签: system freebsd kernel system-calls


    【解决方案1】:

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

    我可能问得很愚蠢 问题,但请帮忙。

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

    【讨论】:

      猜你喜欢
      • 2015-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-10
      • 1970-01-01
      • 1970-01-01
      • 2017-06-02
      相关资源
      最近更新 更多