FreeBSD Bugzilla – Attachment 168466 Details for
Bug 208188
multiple identical wait4 results for ptraced processes
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
waitx2.c demonstrate the multiple / identical wait4() results.
waitx2.c (text/x-csrc), 3.26 KB, created by
joss.upton
on 2016-03-21 20:38:30 UTC
(
hide
)
Description:
waitx2.c demonstrate the multiple / identical wait4() results.
Filename:
MIME Type:
Creator:
joss.upton
Created:
2016-03-21 20:38:30 UTC
Size:
3.26 KB
patch
obsolete
> >#include <sys/types.h> >#include <sys/ptrace.h> >#include <sys/wait.h> >#include <sys/time.h> >#include <sys/socket.h> >#include <signal.h> >#include <err.h> >#include <stdio.h> >#include <fcntl.h> >#include <unistd.h> >#include <errno.h> > >volatile int done; > >#define NWAITLOG 10 >volatile int logindex; >struct wait_log { > int wl_status; > pid_t wl_pid; >} waitlog[NWAITLOG]; > >void run_child(int *); >void alarm_handler(int); >void child_handler(int); > >int >main(int argc, char *argv[]) { > pid_t pid; > int socks[2], i; > struct sigaction sa; > sigset_t sset; > struct itimerval itimer; > > if (socketpair(AF_LOCAL, SOCK_STREAM, PF_UNSPEC, socks) == -1) > err(1, "socketpair"); > > pid = fork(); > if (pid == 0) > run_child(socks); > > if (close(socks[1]) == -1) > err(1, "close-socket"); > > sa.sa_flags = SA_RESTART; > sigemptyset(&sa.sa_mask); > sigaddset(&sa.sa_mask, SIGCHLD); > sigaddset(&sa.sa_mask, SIGALRM); > sa.sa_handler = child_handler; > if (sigaction(SIGCHLD, &sa, NULL) == -1) > err(1, "sigaction-child"); > > sa.sa_flags = SA_RESTART; > sigemptyset(&sa.sa_mask); > sigaddset(&sa.sa_mask, SIGCHLD); > sigaddset(&sa.sa_mask, SIGALRM); > sa.sa_handler = alarm_handler; > if (sigaction(SIGALRM, &sa, NULL) == -1) > err(1, "sigaction-child"); > > sigemptyset(&sset); > sigaddset(&sset, SIGCHLD); > sigaddset(&sset, SIGALRM); > if (sigprocmask(SIG_BLOCK, &sset, NULL) == -1) > err(1, "sigprocmask(block)"); > > itimer.it_interval.tv_sec = itimer.it_value.tv_sec = 5; > itimer.it_interval.tv_usec = itimer.it_value.tv_usec = 0; > if (setitimer(ITIMER_REAL, &itimer, NULL) == -1) > err(1, "setitimer"); > > done = 0; > logindex = 0; > close(socks[0]); > sigemptyset(&sset); > for (;;) { > sigsuspend(&sset); > if (done) > break; > } > > for (i = 0; i < logindex; i++) { > printf("%d: pid=%d", i, waitlog[i].wl_pid); > if (WIFEXITED(waitlog[i].wl_status)) > printf(" exited(%d)", > WEXITSTATUS(waitlog[i].wl_status)); > if (WIFSIGNALED(waitlog[i].wl_status)) > printf(" signaled(%d)", > WTERMSIG(waitlog[i].wl_status)); > if (WIFSTOPPED(waitlog[i].wl_status)) > printf(" stopped(%d)", WSTOPSIG(waitlog[i].wl_status)); > if (WCOREDUMP(waitlog[i].wl_status)) > printf(" core-dump"); > printf("\n"); > } >} > >void >alarm_handler() { > done = 1; >} > >void >child_handler() { > pid_t pid; > int sts, i; > > for (;;) { > pid = wait4(-1, &sts, WNOHANG, NULL); > if (pid == 0 || (pid == -1 && errno == ECHILD)) > break; > if (pid == -1) > err(1, "wait4"); > if (logindex >= NWAITLOG) > errx(1, "waitlog full"); > > if (WIFSTOPPED(sts) && WSTOPSIG(sts) == SIGTRAP) { > ptrace(PT_CONTINUE, pid, (caddr_t)1, 0); > } > > i = logindex++; > waitlog[i].wl_status = sts; > waitlog[i].wl_pid = pid; > } >} > >void >run_child(int socks[2]) { > ssize_t r; > int fd; > char c; > > if (close(socks[0]) == -1) > err(1, "close-socket"); > > r = read(socks[1], &c, sizeof(c)); > if (r == -1) > err(1, "read"); > if (r != 0) > errx(1, "unexpected read"); > > if (close(socks[1]) == -1) > err(1, "close-socket"); > > if (ptrace(PT_TRACE_ME, getpid(), 0, 0) == -1) > err(1, "ptrace-trace-me"); > > fd = open("/dev/null", O_RDWR, 0); > if (fd == -1) > err(1, "/dev/null"); > if (dup2(fd, 0) < 0) > err(1, "dup2-stdin"); > if (dup2(fd, 1) < 0) > err(1, "dup2-stdout"); > if (dup2(fd, 2) < 0) > err(1, "dup2-stderr"); > if (fd > 2 && close(fd) < 0) > err(1, "close /dev/null"); > > execl("/bin/cat", "cat", NULL); > err(1, "execv"); >}
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Raw
Actions:
View
Attachments on
bug 208188
: 168466 |
168467