Реализация FreeBSD kill (2) - PullRequest
1 голос
/ 30 июня 2011

Я изучаю курс 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 Ответ

4 голосов
/ 30 июня 2011

1) pid установлен вручную на 0 и -1, чтобы указать группу процессов или sth при вызове системного вызова?

  • Если 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);

Я мог бы спросить оченьглупые вопросы, но, пожалуйста, помогите.

Код ядра довольно очевиден (никакие причудливые алгоритмы не используются).Единственная проблема в том, что он очень большой и вам нужно терпение.

...