initial commit
commit
e618f5a058
@ -0,0 +1,3 @@
|
||||
main: main.c
|
||||
gcc -Wall -Wextra -pedantic -o main main.c -pthread
|
||||
|
@ -0,0 +1,11 @@
|
||||
# Clone Thread Example
|
||||
This C program uses clone() to create a new thread. It illustrates, that the new thread shares the same data and heap segment. The main process creates a new thread with clone. clone() will execute a function that prints a buffer to stdout and then waits 2 seconds and does it again. In the meantime, the main thread changes the content of the buffer. That the child thread prints different things shows that they are not seperate processes.
|
||||
|
||||
# Compile
|
||||
```
|
||||
make
|
||||
```
|
||||
# Run
|
||||
```bash
|
||||
./main
|
||||
```
|
@ -0,0 +1,40 @@
|
||||
#define _GNU_SOURCE
|
||||
#include <sched.h>
|
||||
#include <sys/wait.h>
|
||||
// #include <sys/utsname.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <sys/mman.h>
|
||||
#include <strings.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#define errExit(msg) do { perror(msg); exit(EXIT_FAILURE); \
|
||||
} while (0)
|
||||
#define STACK_SIZE (1024 * 1024)
|
||||
|
||||
int child(void* buf){
|
||||
printf("print buf (addr=%p): %s\n",buf,(char *) buf);
|
||||
sleep(2);
|
||||
printf("print buf (addr=%p): %s\n",buf, (char *)buf);
|
||||
exit(EXIT_SUCCESS);
|
||||
}
|
||||
|
||||
int main(){
|
||||
char * stack = mmap(NULL,
|
||||
STACK_SIZE,
|
||||
PROT_READ | PROT_WRITE,
|
||||
MAP_PRIVATE | MAP_ANONYMOUS | MAP_STACK,
|
||||
-1,
|
||||
0);
|
||||
if (stack == MAP_FAILED)
|
||||
errExit("mmap");
|
||||
char * buf = malloc(256 * sizeof(char));
|
||||
snprintf(buf,256,"inital");
|
||||
int pid = clone(child, stack + STACK_SIZE,SIGCHLD | CLONE_THREAD | CLONE_SIGHAND | CLONE_VM, buf);
|
||||
if (pid < 0)
|
||||
errExit("failed to create child");
|
||||
sleep(1);
|
||||
snprintf(buf,256,"changed");
|
||||
sleep(2);
|
||||
exit(EXIT_SUCCESS);
|
||||
}
|
Loading…
Reference in New Issue