Linux Kill()错误出乎意料

Linux kill() error unexpected

本文关键字:错误 出乎意料 Kill Linux      更新时间:2023-10-16

kill(pid,0)似乎无法正确设置错误代码...

错误

如果:

,kill()函数将失败

einval sig参数的值是无效或不支持的 信号号。
eperm该过程无权发送 向任何接收过程发出信号。
ESRCH没有过程或过程组可以 找到与PID指定的相对应的。下列 部分内容丰富。 1

它正在返回enoent(没有这样的文件或目录),然后有时它返回EINTR(系统调用中断)...

这是我在做的:

kill(g_StatusInstance[i].pid, SIGTERM) == -1 && log_fatal_syscall("kill-sigterm");
kill(g_StatusInstance[i].pid, 0);
log_info_console( "Checking process for errors: %sn", strerror(errno));
if(errno != ENOENT)
{
   kill(g_StatusInstance[i].pid, SIGKILL) == -1 && log_fatal_syscall("kill-sigkill");
}

我做错了什么?

Kill(pid, 0)似乎无法正确设置错误代码... 它正在返回恩典... eintr

这是我在做的:

...
kill(g_StatusInstance[i].pid, 0);
log_info_console( "Checking process for errors: %sn", strerror(errno));

我做错了吗?

是。您没有检查kill()系统调用的返回值。kill()在成功的情况下不会将ERRNO设置为任何特定值。

尝试以下操作:

if(kill(g_StatusInstance[i].pid, 0) == -1) {
  log_info_console( "Checking process for errors: %sn", strerror(errno));
} else {
  log_info_console( "kill returned 0, process still aliven" );
}

更一般地,您应该检查每个系统呼叫或库呼叫的返回值,除非声明返回void

基于讨论,您的问题可能是"为什么我的 kill()不产生我期望的效果?"

为了理解为什么会发生这种情况,您应该首先在kill()的目标上尝试strace。通过pid将其连接到您现有的过程中,或根据strace调用。strace将显示对信号面膜的修改,并指示信号何时到达。如果您的信号到达,则应调试由kill()目标的过程,并尝试了解预期已安装/默认信号处理程序。