Clone () syscall in C and sharing

I am trying to use the clone () script to create a thread that shares resources with the parent process. I read in a book that if I use the following flags, I can do this: CLONE_VM | CLONE_FILES | CLONE_SIGHAND | CLONE_FS

But it seems that the variables are not shared.

#include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <linux/sched.h> #include <string.h> #define STACK_SIZE 65536 #define BUFSIZE 200 int n = 5; int Child(void *); int main() { pid_t pid; char *stack; stack = malloc(STACK_SIZE); pid = clone(Child,stack + STACK_SIZE, CLONE_SIGHAND|CLONE_FS|CLONE_VM|CLONE_FILES); wait(NULL); char buf[BUFSIZE]; sprintf(buf,"Back to parent: Value of n: %d\n",n); write(1,buf,strlen(buf)); return 0; } int Child(void *args) { n += 15; char buf[BUFSIZE]; sprintf(buf,"In child: Value of n: %d\n",n); write(1,buf,strlen(buf)); } 

The output continues to change. I'm confused.

+4
source share
1 answer
 int n = 5; int Child(void *); int main() { int n = 5; 

You have two variables called n . Child works globally, but main uses the value defined in its scope.

You must also change your wait call to waitpid(-1, NULL, __WALL) , otherwise you will not actually wait for the cloned process. (Or you can add |SIGCHLD to the clone parameters.)

From clone(2) docs:

The bottom byte of the flags contains the number of the completion signal sent to the parent when the child dies. If this signal is specified as something other than SIGCHLD, then the parent process must specify the __WALL or __WCLONE options when waiting for the child to wait (2). If no signal is specified, then the parent process is not signaled when the child is completed.

+2
source

Source: https://habr.com/ru/post/1434455/


All Articles