我有一个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