Files
mckernel/test/issues/771+1179+1143/C771T037.c
Tomoki Shirasawa ed1edb152b ptrace supports threads
Fujitsu: POSTK_DEBUG_TEMP_FIX_53, POSTK_DEBUG_ARCH_DEP_44
Refs: #771, #1179, #1143
Change-Id: Ie17ece6864f0eeb0c0e550f4e369abb77980a0d0
2018-10-01 03:57:16 +00:00

151 lines
2.8 KiB
C

#define _GNU_SOURCE
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <pthread.h>
#include <errno.h>
#include <unistd.h>
#include <signal.h>
#include <sys/syscall.h>
#include <sys/mman.h>
#include <sys/socket.h>
#include <sys/ptrace.h>
#include <sys/user.h>
#include <sys/wait.h>
volatile char *m;
volatile int *x;
void *
thr(void *arg)
{
pid_t tid;
tid = syscall(SYS_gettid);
*x = tid;
while (*x == tid);
return NULL;
}
int
main(int argc, char **argv)
{
pthread_t th;
pid_t tid;
pid_t pid;
int st;
int rc;
x = mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS,
-1, 0);
if (x == (void *)-1) {
perror("mmap");
exit(1);
}
*x = 0;
rc = pthread_create(&th, NULL, thr, NULL);
if (rc) {
fprintf(stderr, "pthread_create: %d\n", rc);
exit(1);
}
while (*x == 0);
tid = *x;
fprintf(stderr, "pid=%d\n", getpid());
fprintf(stderr, "tid=%d\n", tid);
if ((pid = fork()) == 0) {
pid = getppid();
if (ptrace(PTRACE_ATTACH, tid, 0, 0) == -1) {
fprintf(stderr, "*** C771T037 ATTACH NG err=%d\n",
errno);
exit(1);
}
if (ptrace(PTRACE_ATTACH, pid, 0, 0) == -1) {
fprintf(stderr, "*** C771T037 ATTACH NG err=%d\n",
errno);
exit(1);
}
rc = wait4(pid, &st, WNOHANG, NULL);
if (rc == -1) {
fprintf(stderr, "*** C771T037 wait4(pid) NG err=%d\n",
errno);
}
else {
fprintf(stderr, "*** C771T037 wait4(pid) OK\n");
}
rc = wait4(tid, &st, WNOHANG, NULL);
if (rc == -1 && errno == ECHILD) {
fprintf(stderr, "*** C771T038 wait4(tid) OK\n");
}
else {
fprintf(stderr, "*** C771T038 wait4(tid) NG err=%d\n",
errno);
}
rc = wait4(pid, &st, WNOHANG|__WCLONE, NULL);
if (rc == -1 && errno == ECHILD) {
fprintf(stderr,
"*** C771T039 wait4(pid, __WCLONE) OK\n");
}
else {
fprintf(stderr,
"*** C771T039 wait4(pid, __WCLONE) NG err=%d\n",
errno);
}
rc = wait4(tid, &st, WNOHANG|__WCLONE, NULL);
if (rc == -1) {
fprintf(stderr,
"*** C771T040 wait4(tid, __WCLONE) NG err=%d\n",
errno);
}
else {
fprintf(stderr,
"*** C771T040 wait4(tid, __WCLONE) OK\n");
}
rc = wait4(pid, &st, WNOHANG|__WALL, NULL);
if (rc == -1) {
fprintf(stderr,
"*** C771T041 wait4(pid, __WALL) NG err=%d\n",
errno);
}
else {
fprintf(stderr,
"*** C771T041 wait4(pid, __WALL) OK\n");
}
rc = wait4(tid, &st, WNOHANG|__WALL, NULL);
if (rc == -1) {
fprintf(stderr,
"*** C771T042 wait4(tid, __WALL) NG err=%d\n",
errno);
}
else {
fprintf(stderr,
"*** C771T042 wait4(tid, __WALL) OK\n");
}
if (ptrace(PTRACE_DETACH, tid, NULL, NULL) == -1) {
fprintf(stderr, "*** C771T042 DETACH NG err=%d\n",
errno);
exit(1);
}
if (ptrace(PTRACE_DETACH, pid, NULL, NULL) == -1) {
fprintf(stderr, "*** C771T042 DETACH NG err=%d\n",
errno);
exit(1);
}
*x = 0;
exit(0);
}
while (*x == tid);
exit(0);
}