initial commit

master
leonnicolas 4 years ago
commit e618f5a058
No known key found for this signature in database
GPG Key ID: 088D0743E2B65C07

@ -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…
Cancel
Save