1

Kill(pid, 0) 似乎没有正确设置错误代码...如 man for kill 中所述

错误

如果出现以下情况,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: %s\n", strerror(errno));

if(errno != ENOENT)
{
   kill(g_StatusInstance[i].pid, SIGKILL) == -1 && log_fatal_syscall("kill-sigkill");
}

难道我做错了什么?

4

2 回答 2

4

Kill(pid, 0)似乎没有正确设置错误代码......它正在返回 ENOENT...... EINTR

这是我正在做的事情:

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

难道我做错了什么?

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

尝试这个:

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

更一般地,您应该检查每个系统调用或库调用的返回值,除非它被声明为 return void

于 2012-10-25T19:10:42.513 回答
0

根据讨论,您的问题可能是“为什么我kill()没有产生我预期的效果?”

为了理解为什么会发生这种情况,您应该首先尝试strace作为kill(). 通过 将其附加到现有流程pid或在strace. strace将显示对信号掩码的修改并指示信号何时到达。如果您的信号到达,您应该调试目标进程kill()并尝试了解已安装/默认的信号处理程序应该做什么。

于 2012-10-26T04:11:44.760 回答