Register for dump notifications
#include <sys/dcmd_dumper.h> #define DCMD_DUMPER_NOTIFYEVENT __DIOT(_DCMD_MISC, DUMPER_NOTIFYEVENT, struct sigevent)
Argument | Value |
---|---|
filedes | A file descriptor for the dumper that you obtained by opening /proc/dumper |
dcmd | DCMD_DUMPER_NOTIFYEVENT |
dev_data_ptr | A pointer to a struct sigevent |
n_bytes | sizeof(struct sigevent) |
dev_info_ptr | NULL |
This command registers a program for dump notifications.
A struct sigevent that's filled in to indicate what type of notification you want.
None.
#include <stdio.h> #include <stdint.h> #include <inttypes.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/dcmd_dumper.h> #include <fcntl.h> #include <unistd.h> #include <devctl.h> #include <sys/neutrino.h> int dumper_notify_attach(struct sigevent *devent) { int dumper_fd; dumper_fd = open("/proc/dumper",O_RDONLY); if (dumper_fd >= 0) { devctl(dumper_fd, DCMD_DUMPER_NOTIFYEVENT, devent, sizeof(*devent), NULL); fcntl(dumper_fd, F_SETFD, FD_CLOEXEC); } else { dumper_fd = -1; } return dumper_fd; } #define DUMP_PULSE_CODE 0x50 int main(int argc, const char *argv[], const char*envp[]) { int dp_chid=-1; int dp_coid=-1; struct sigevent devent; struct _pulse gpulse; int dumper_fd=-1; int rcvid; pid_t pid; // create death pulses channel dp_chid = ChannelCreate(_NTO_CHF_FIXED_PRIORITY); if(dp_chid==-1){ perror("ERROR: ChannelCreate"); exit( -1 ); } dp_coid = ConnectAttach(0, 0, dp_chid, _NTO_SIDE_CHANNEL, _NTO_COF_CLOEXEC); if(dp_coid==-1){ perror("ERROR: ConnectAttach"); exit( -1 ); } SIGEV_PULSE_INIT(&devent, dp_coid, sched_get_priority_max(SCHED_RR), DUMP_PULSE_CODE, -1); dumper_fd=dumper_notify_attach(&devent); if(dumper_fd==-1){ perror("ERROR: opening /proc/dumper"); exit( -1 ); } for (;;) { // Blocks waiting for a pulse rcvid = MsgReceivePulse(dp_chid, &gpulse, sizeof(gpulse),NULL); switch (gpulse.code) { case DUMP_PULSE_CODE: // something died pid = gpulse.value.sival_int; fprintf(stderr, "Received Death Pulse code %"PRId8"\n", gpulse.code); fprintf(stderr, "Process Pid %d died abnormally\n" , pid); break; default: fprintf(stderr, "Unknown pulse code: %"PRId8"\n" , gpulse.code); break; } } if (dumper_fd >=0) { devctl(dumper_fd, DCMD_DUMPER_REMOVEALL, NULL, 0, NULL); /* This would have worked too, because we attached only one event: devctl(dumper_fd, DCMD_DUMPER_REMOVEEVENT, NULL, 0, NULL); */ close(dumper_fd); } if (dp_coid >=0) ConnectDetach(dp_coid); if (dp_chid >=0) ChannelDestroy(dp_chid); exit(0); }
DCMD_DUMPER_REMOVEALL, DCMD_DUMPER_REMOVEEVENT
devctl() in the QNX Neutrino C Library Reference
dumper in the Utilities Reference