繁体   English   中英

Linux kill()错误意外

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM