जवाबों:
इसके लिए मैन पेज sigaction(2)
बताता है कि सिग्नल भेजने वाले का PID आपके सिग्नल हैंडलर को दिए गए siginfo_t संरचना में उपलब्ध है। यह स्पष्ट रूप से आवश्यक है कि आप sigaction () का उपयोग करें।
मैन पेज से:
सिगनेशन स्ट्रक्चर को कुछ इस तरह से परिभाषित किया गया है:
struct sigaction {
void (*sa_handler)(int);
void (*sa_sigaction)(int, siginfo_t *, void *);
sigset_t sa_mask;
int sa_flags;
void (*sa_restorer)(void);
};
और siginfo_t
संरचना इस तरह दिखती है:
siginfo_t {
int si_signo; /* Signal number */
int si_errno; /* An errno value */
int si_code; /* Signal code */
int si_trapno; /* Trap number that caused
hardware-generated signal
(unused on most architectures) */
pid_t si_pid; /* Sending process ID */
uid_t si_uid; /* Real user ID of sending process */
int si_status; /* Exit value or signal */
clock_t si_utime; /* User time consumed */
clock_t si_stime; /* System time consumed */
sigval_t si_value; /* Signal value */
int si_int; /* POSIX.1b signal */
void *si_ptr; /* POSIX.1b signal */
int si_overrun; /* Timer overrun count; POSIX.1b timers */
int si_timerid; /* Timer ID; POSIX.1b timers */
void *si_addr; /* Memory location which caused fault */
int si_band; /* Band event */
int si_fd; /* File descriptor */
}
DTrace (OS X, Solaris,…। दूसरों) के साथ प्लेटफ़ॉर्म पर आप इसे एक जांच के साथ इस तरह इस्तेमाल कर सकते हैं जैसे कि आपके द्वारा दी गई जानकारी को लॉग इन करने के लिए:
sudo dtrace -n 'proc:::signal-send { printf("Process %d (%s by UID %d) sending signal %d to pid=%d\n",pid,execname,uid,args[2],args[1]->pr_pid); }'
मैं http://www.brendangregg.com/DTrace/dtrace_oneliners.txt के निचले भाग में पाई गई एक स्क्रिप्ट के आधार पर /programming//a/10465606/178383 पर कुछ अतिरिक्त "प्रासंगिक चर नाम" युक्तियां बताता हूं । और कुछ बुनियादी परीक्षण के तहत काम करने लगता है। अब, अगर केवल मेरी प्रक्रिया अप्रत्याशित रूप से फिर से मर जाएगी! ;-)
आप सिस्टमटैप का उपयोग करके संकेतों का पता लगा सकते हैं। ये रहा एक सरल उदाहरण
https://sourceware.org/systemtap/examples/lwtools/killsnoop-nd.stp