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