ttrace.2 (2010 09)
t
ttrace(2) ttrace(2)
stp->tts_u.tts_exit.tts_exitcode);
break;
case TTEVT_SIGNAL:
(void) printf("%s %d\n", ev_name(stp->tts_event),
stp->tts_u.tts_signal.tts_signo);
break;
default:
(void) printf("%s\n", ev_name(stp->tts_event));
}
}
main(int argc, char **argv)
{
ttevent_t ev;
ttstate_t st;
pid_t pid;
int pfd1[2];
int pfd2[2];
char c;
--argc, ++argv;
pid = atoi(*argv);
ev.tte_events = TTEVT_SYSCALL|TTEVT_EXEC|TTEVT_EXIT;
ev.tte_opts = TTEO_NONE;
if (pid) {
siginfo_t si;
dottrace(TT_PROC_ATTACH, pid, 0, TT_DETACH_ON_EXIT,
TT_VERSION, 0);
if (waitid(P_PID, pid, &si, WEXITED|WSTOPPED)<0||
si.si_pid != pid || si.si_code != CLD_STOPPED) {
errexit("waitid");
}
dottrace(TT_PROC_GET_FIRST_LWP_STATE, pid, 0, (uint64_t) &st,
(uint64_t) sizeof st, 0);
show_event(&st);
dottrace(TT_PROC_SET_EVENT_MASK, pid, 0,
(uint64_t) &ev, sizeof ev, 0);
}
else {
if (pipe(pfd1) < 0 || pipe(pfd2) < 0) {
errexit("pipe");
}
switch(pid = fork()) {
case -1:
errexit("fork");
case 0:
ppid = getppid();
dottrace(TT_PROC_SETTRC, 0, 0, 0, TT_VERSION, 0);
/* tell parent we are SETTRC’ed */
if (write(pfd2[1], (void *) &c, sizeof c) != sizeof c) {
errexit("write");
}
/* wait for exec event to be set*/
if (read(pfd1[0], (void *) &c, sizeof c) != sizeof c) {
errexit("read");
}
(void) close(pfd1[0]);
20 Hewlett-Packard Company − 20 − HP-UX 11i Version 3: September 2010