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()
目标的过程,并尝试了解预期已安装/默认信号处理程序。