[英]Linux kill() error unexpected
杀(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");
}
难道我做错了什么?
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" );
}
更一般地说,您应该检查每个系统调用或库调用的返回值,除非声明它返回void
。
根据讨论,你的问题可能是“为什么我的kill()
没有产生我预期的效果?”
为了理解这是为什么发生的事情,你应该首先尝试strace
的过程也就是目标kill()
通过pid
将其附加到现有进程或在strace
下调用它。 strace
将显示对信号掩码的修改并指示信号何时到达。 如果您的信号到达,您应该调试kill()
针对的进程,并尝试了解安装/默认信号处理程序应该做什么。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.