簡體   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