r = read(handlers[signum]->pipefd[0], &v, 1);
if (r == 1) {
siginfo_t * siginfo = &handlers[signum]->info_t;
- string task_name = get_name_by_pid(siginfo->si_pid);
- derr << "received signal: " << sig_str(signum)
- << " from " << " PID: " << siginfo->si_pid
- << " task name: " << task_name
- << " UID: " << siginfo->si_uid
- << dendl;
- handlers[signum]->handler(signum);
+ ostringstream message;
+ message << "received signal: " << sig_str(signum);
+ switch (siginfo->si_code) {
+ case SI_USER:
+ message << " from " << get_name_by_pid(siginfo->si_pid);
+ // If PID is undefined, it doesn't have a meaning to be displayed
+ if (siginfo->si_pid) {
+ message << " (PID: " << siginfo->si_pid << ")";
+ } else {
+ message << " ( Could be generated by pthread_kill(), raise(), abort(), alarm() )";
+ }
+ message << " UID: " << siginfo->si_uid;
+ break;
+ default:
+ /* As we have a not expected signal, let's report the structure to help debugging */
+ message << ", si_code : " << siginfo->si_code;
+ message << ", si_value (int): " << siginfo->si_value.sival_int;
+ message << ", si_value (ptr): " << siginfo->si_value.sival_ptr;
+ message << ", si_errno: " << siginfo->si_errno;
+ message << ", si_pid : " << siginfo->si_pid;
+ message << ", si_uid : " << siginfo->si_uid;
+ message << ", si_addr" << siginfo->si_addr;
+ message << ", si_status" << siginfo->si_status;
+ break;
+ }
+ derr << message.str() << dendl;
+ handlers[signum]->handler(signum);
}
}
}