我有一個java應用程序得到SIG TERM
。我想知道發送此信號的進程的PID。
這可能嗎?我怎麼能告訴Linux哪些進程發送了我的進程信號
回答
的兩種方法是SA_SIGINFO
和signalfd()
,這允許程序接收發送有關信號非常詳細信息,包括髮送者的PID。
呼叫
sigaction()
並傳遞給它一個struct sigaction
,其具有在sa_sigaction
所需信號處理程序,並在sa_flags
組SA_SIGINFO
標誌。使用此標誌,您的信號處理程序將收到三個參數,其中一個參數是siginfo_t
結構,其中包含發件人的PID和UID。調用
signalfd()
並從中讀取signalfd_siginfo
結構(通常在某種選擇/輪詢循環中)。內容將類似於siginfo_t
。
要使用哪一個取決於您的應用程序的寫入方式;他們可能無法在純C以外工作,我也沒有希望讓他們在Java中工作。它們在Linux之外也是不可移植的。他們也可能是做你正在努力實現的非常錯誤的方式。
想知道你是否可以通過e寫一個C DLL並使用JAVA中的這個。 G。 JNI ... – Aconcagua
不,信號不作爲進程間通信通道。據我所知,沒有PID傳遞。發送PID與我所見過的所有信號無關。您可以相對確定發送信號的進程是否具有root權限,或者屬於與您的進程相同的UID。
發送信號的過程可能不再存在。如果使用kill命令而不是內置的shell,幾乎可以確定該進程不再存在。
從Java方面來看,這更加困難。該進程運行在Java虛擬機中,該虛擬機是從操作系統中抽象出來的。並非所有操作系統概念都與本機有關。
Linux特定我還需要識別程序中的信號發送器,所以我把grawity的answer,並在我的程序中使用它,它運行良好。
這裏的示例代碼:
send_signal_raise。Ç
// send signal to self test - raise()
#include <stdio.h>
#include <signal.h>
#include <pthread.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
static int int_count = 0, max_int = 5;
static struct sigaction siga;
static void multi_handler(int sig, siginfo_t *siginfo, void *context) {
// get pid of sender,
pid_t sender_pid = siginfo->si_pid;
if(sig == SIGINT) {
int_count++;
printf("INT(%d), from [%d]\n", int_count, (int)sender_pid);
return;
} else if(sig == SIGQUIT) {
printf("Quit, bye, from [%d]\n", (int)sender_pid);
exit(0);
}
return;
}
int raise_test() {
// print pid
printf("process [%d] started.\n", (int)getpid());
// prepare sigaction
siga.sa_sigaction = *multi_handler;
siga.sa_flags |= SA_SIGINFO; // get detail info
// change signal action,
if(sigaction(SIGINT, &siga, NULL) != 0) {
printf("error sigaction()");
return errno;
}
if(sigaction(SIGQUIT, &siga, NULL) != 0) {
printf("error sigaction()");
return errno;
}
// use "ctrl + c" to send SIGINT, and "ctrl + \" to send SIGQUIT,
int sig;
while(1) {
if(int_count < max_int) {
sig = SIGINT;
} else {
sig = SIGQUIT;
}
raise(sig); // send signal to itself,
sleep(1); // sleep a while, note that: SIGINT will interrupt this, and make program wake up,
}
return 0;
}
int main(int argc, char *argv[]) {
raise_test();
return 0;
}
編譯:
gcc -pthread -Wall send_signal_raise.c
執行:
./a.out
它做什麼:
該程序發送SIGINT
自己10次,然後發送SIGQUIT
自行終止。
此外,它的執行中,按CTRL + Ç期間發送SIGINT
,或CTRL + \發送SIGQUIT
這將由手終止程序。
程序可以成功識別誰發送了信號。
- 1. 發送信號到進程
- 2. 我怎麼知道哪種類型的linux的進程將用於這些?
- 3. 忽略發送到我自己的進程組的信號
- 4. 如何告訴子進程停止轉義我的引號?
- 5. 發送給子進程和父進程的信號
- 6. 按名稱發送信號給進程
- 7. 發送信號通過php進程
- 8. 發送信號給子進程?
- 9. 我怎麼能告訴你使用Dropzone.js
- 10. 在我的django視圖中,我怎麼能告訴兩個表單中的哪些字段填滿了?
- 11. 在父進程和子進程之間發送信號
- 12. fork和信號:如何從父進程發送信號到特定子進程
- 13. 爲什麼子進程沒有回覆父進程發送的信號?
- 14. 附加到進程時gdb發送哪個信號?
- 15. 我怎麼能告訴Flash Builder 4中到哪裏尋找FlashPlayer.exe
- 16. 我可以確定哪個進程向我的窗口發送了消息嗎?
- 17. 哪個進程發送SIGKILL
- 18. 告訴我我選擇了哪些服務https://redpen.io/或https://maquetter.com?
- 19. 我怎麼進程返回要麼
- 20. 進程之間的信號查詢Linux
- 21. 我怎樣才能減少一個最小的Linux進程
- 22. 我怎麼能告訴我的應用程序窗口是前景窗口
- 23. 我怎樣才能找出這些文件或進程做(Linux)的
- 24. ,我該怎麼傳進我的功能
- 25. 我怎麼能告訴Emacs我的git分支已經改變了?
- 26. Linux進程間可重入信號量
- 27. 我怎麼能告訴Swift等到我的價值被下載?
- 28. 我怎麼能找到產生大量子進程的前5個進程
- 29. 我怎麼能知道的信號
- 30. 我有哪些選項可用於Java進程通信?
謝謝!這看起來像一個類似的問題和良好的答案。 – oshai