OSDN Git Service

original
[gb-231r1-is01/Gingerbread_2.3.3_r1_IS01.git] / system / extras / tests / bionic / libc / common / test_clone.c
1 /* Check that clone() is implemented and properly works
2  */
3 #define __GNU_SOURCE 1
4 #include <stdio.h>
5 #include <errno.h>
6 #include <sched.h>
7 #include <unistd.h>
8 #include <signal.h>
9 #include <stdlib.h>
10 #include <sys/ptrace.h>
11 #include <sys/wait.h>
12 #include <stdarg.h>
13 #include <string.h>
14
15 static int
16 clone_child (void *arg)
17 {
18  errno = 0;
19  ptrace (PTRACE_TRACEME, 0, 0, 0);
20  if (errno != 0)
21    perror ("ptrace");
22  if (kill (getpid (), SIGSTOP) < 0)
23    perror ("kill");
24  return 0;
25 }
26
27 #define PAGE_SIZE 4096
28 #define STACK_SIZE (4 * PAGE_SIZE)
29
30 char clone_stack[STACK_SIZE] __attribute__ ((aligned (PAGE_SIZE)));
31
32 int
33 main ()
34 {
35  int pid,child;
36  int status;
37
38  pid = clone (clone_child, clone_stack + 3 * PAGE_SIZE,
39               CLONE_VM | SIGCHLD, NULL);
40  if (pid < 0)
41    {
42      perror ("clone");
43      exit (1);
44    }
45  printf ("child pid %d\n", pid);
46
47  //sleep(20);
48  child = waitpid (pid, &status, 0);
49  printf("waitpid returned %d\n", child);
50  if (child < 0) {
51    perror ("waitpid");
52    return 1;
53  }
54  printf ("child %d, status 0x%x\n", child, status);
55  return 0;
56 }