Suppose if your program randomly crashes and you find that some process is sending SIGTERM to your program , you can find the process ID of the sender using "sigaction"
You need to use sigaction call to set up your signal handler instead of signal. Doing so will let you set up a signal handler that takes three parameters:
Example code and steps:
1) catchsignal.c
"/* Example of using sigaction() to setup a signal handler with 3 arguments
4) Execute the script
sh sendsig.sh
5) Run the program
You need to use sigaction call to set up your signal handler instead of signal. Doing so will let you set up a signal handler that takes three parameters:
- An int, for the signal number (just like signal)
- A siginfo_t *, which is a structure containing all sorts of information about the source of the signal, including the pid of the sender if applicable. (It also includes some information about the cause of the signal for automatic signals like SIGSEGV.)
- A ucontext_t *, which has to do with which thread got the signal. Mostly ignorable
Example code and steps:
1) catchsignal.c
"/* Example of using sigaction() to setup a signal handler with 3 arguments
* including siginfo_t. */ #include <stdio.h> #include <unistd.h> #include <signal.h> #include <string.h> static void hdl (int sig, siginfo_t *siginfo, void *context) { printf ("Sending PID: %ld, UID: %ld\n", (long)siginfo->si_pid, (long)siginfo->si_uid); } int main (int argc, char *argv[]) { struct sigaction act; memset (&act, '\0', sizeof(act)); /* Use the sa_sigaction field because the handles has two additional parameters */ act.sa_sigaction = &hdl; /* The SA_SIGINFO flag tells sigaction() to use the sa_sigaction field, not sa_handler. */ act.sa_flags = SA_SIGINFO; if (sigaction(SIGTERM, &act, NULL) < 0) { perror ("sigaction"); return 1; } while (1) sleep (10); return 0;
}
2) Compile the program
gcc -o catchsignal catchsignal.c
3) Shell script to trigger a signal
sendsig.sh
#!/bin/sh
while [ 1 ]
do
pidof=`ps -ef | grep catchsignal | grep -v "grep" | awk '{print $2}'`
if [ ! -z $pidof ]
then
kill $pidof
fi
sleep 10
done
4) Execute the script
sh sendsig.sh
5) Run the program
./catchsignal
6) Output of the program
Sending PID: 18532, UID: 0
Sending PID: 18532, UID: 0
Sending PID: 18532, UID: 0
No comments:
Post a Comment