#include #include #include #include #include #include #include #define FLAGS (CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND \ | CLONE_THREAD | CLONE_SYSVSEM) static int child_func (void *arg) { sleep (60); _exit (EXIT_SUCCESS); abort (); } int main (void) { #ifndef PAGE_SIZE #define PAGE_SIZE 0x1000 #endif const size_t stack_size = PAGE_SIZE; unsigned char *stack = mmap (NULL, stack_size, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); int child_tid; assert (stack != NULL); assert (stack != MAP_FAILED); stack[0] = 0; stack[stack_size - 1] = 0; #ifdef __ia64__ extern int __clone2 (int (*fn) (void *arg), void *child_stack, size_t stack_size, int flags, void *arg); child_tid = __clone2 (child_func, stack + stack_size, stack_size, FLAGS, NULL); #else /* !__ia64__ */ child_tid = clone (child_func, stack + stack_size, FLAGS, NULL); #endif /* !__ia64__ */ sleep (60); return EXIT_SUCCESS; }