From 9a9b8d27018dad34a0b7d46a0f3287c09a8ba385 Mon Sep 17 00:00:00 2001 From: Bahadir Balban Date: Mon, 10 Nov 2008 12:51:01 +0200 Subject: [PATCH] Added a clone() test to test0. --- tasks/test0/include/tests.h | 1 + tasks/test0/main.c | 3 +++ tasks/test0/src/clone.c | 42 +++++++++++++++++++++++++++++++++++++ 3 files changed, 46 insertions(+) create mode 100644 tasks/test0/src/clone.c diff --git a/tasks/test0/include/tests.h b/tasks/test0/include/tests.h index 3ab522b..946435a 100644 --- a/tasks/test0/include/tests.h +++ b/tasks/test0/include/tests.h @@ -9,5 +9,6 @@ int mmaptest(void); int dirtest(void); int fileio(void); int fileio2(void); +int clonetest(void); #endif /* __TEST0_TESTS_H__ */ diff --git a/tasks/test0/main.c b/tasks/test0/main.c index 3c3b558..be045c2 100644 --- a/tasks/test0/main.c +++ b/tasks/test0/main.c @@ -62,6 +62,9 @@ void main(void) printf("-- FAILED --\n"); } + printf("Testing clone syscall...\n"); + clonetest(); + while (1) wait_pager(0); #if 0 diff --git a/tasks/test0/src/clone.c b/tasks/test0/src/clone.c new file mode 100644 index 0000000..9528e06 --- /dev/null +++ b/tasks/test0/src/clone.c @@ -0,0 +1,42 @@ +/* + * Clone test. + */ + +#include +#include +#include +#include +#include +#include + +int my_thread_func(void *arg) +{ + printf("Cloned child running...\n"); + printf("PID: %d\n", getpid()); + _exit(0); +} + +int clonetest(void) +{ + pid_t childid; + void *child_stack; + + if ((child_stack = mmap(0, 0x1000, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE | MAP_GROWSDOWN, 0, 0)) == MAP_FAILED) { + printf("MMAP failed.\n"); + _exit(1); + } else { + printf("Mapped area starting at %p\n", child_stack); + } + ((int *)child_stack)[-1] = 5; /* Test mapped area */ + + printf("Cloning...\n"); + + if ((childid = clone(my_thread_func, child_stack, + CLONE_PARENT | CLONE_FS | CLONE_VM | CLONE_THREAD | CLONE_SIGHAND, 0)) < 0) { + perror("CLONE failed.\n"); + } else { + printf("Cloned a new thread with child pid %d\n", childid); + } + return 0; +} +