test_clone.c revision 84a66d0c8d79857586bad4e3d3010ee44f8f6971
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 15static int 16clone_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 30char clone_stack[STACK_SIZE] __attribute__ ((aligned (PAGE_SIZE))); 31 32int 33main () 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} 57