【问题标题】:Differentiating a uid-wide kill(-1,…) from a targetted kill区分 uid 范围的 kill(-1,…) 和有针对性的 kill
【发布时间】:2019-07-26 19:45:29
【问题描述】:

如果一个进程运行kill(-1,SIGKILL);(或使用不同的信号)并且调用杀死了调用者(MacOS 的kill(-1,...) 会这样做,尽管 Linux 会让调用者保持活动状态)但不是它的父进程(父进程有不同的 uid) , 父进程能否使用 POSIX 提供的工具来判断 kill-caller 是因为调用 kill(-1,...) 杀死了自己还是因为另一个进程杀死了它而死亡?

【问题讨论】:

  • 信号不携带任何有关其来源的信息,所以不,您无法区分这些情况。

标签: c posix system-calls kill


【解决方案1】:

首先,如果您向进程发送SIGKILL,它们将永远看不到信号 - 它们只是被内核立即杀死。

否则,根据2.4.3 Signal Actions of the POSIX standard,如果您的信号处理程序使用SA_SIGINFO 标志注册,您可以提取发送信号的进程的PID:

如果设置了信号的SA_SIGINFO 标志,则信号捕获 函数应作为 C 语言函数调用输入,如下所示:

void func(int signo, siginfo_t *info, void *context);

其中func是指定的信号捕获函数,signo是 正在传递的信号的信号编号,info 是一个指针 到<signal.h> 中定义的siginfo_t 结构至少包含 以下成员:

Member Type    Member Name   Description
int            si_signo      Signal number.
int            si_code       Cause of the signal.
pid_t          si_pid        Sending process ID.
uid_t          si_uid        Real user ID of sending process.
void *         si_addr       Address of faulting instruction.
int            si_status     Exit value or signal.
union sigval   si_value      Signal value.

si_signo 成员应包含信号编号。这将是 与signo 参数相同。 si_code 成员应包含 识别信号原因的代码。下列 为si_code 定义了非信号特定值:

SI_USER 信号由kill() 函数发送。如果信号是由raise() 发送的,则实现可以将si_code 设置为SI_USERabort() 函数或提供的任何类似函数 实施扩展。 SI_QUEUE 信号由sigqueue() 函数发送。 SI_TIMER 该信号是由timer_settime() 设置的计时器到期生成的。 SI_ASYNCIO 该信号是由异步 I/O 请求的完成生成的。 SI_MESGQ 该信号是由一条消息到达一个空消息队列而产生的。

si_code 的信号特定值也被定义,如在 <signal.h>.

这应该提供足够的信息来判断信号是否是由对kill() 的调用生成的、哪个进程发送了信号、谁发送了信号。或者,如果信号是由内部故障(例如 SIGSEGV)生成的。

【讨论】:

    猜你喜欢
    • 2013-10-15
    • 2017-09-29
    • 2016-07-26
    • 2012-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-29
    相关资源
    最近更新 更多