jimmyr
jimmyr

Reputation: 43

clone() syscall in C and sharing

I'm trying to use a clone() syscall to create a thread which shares resources with the parent process. In the book I read that if I use the following flags, I will be able to do so: CLONE_VM | CLONE_FILES | CLONE_SIGHAND | CLONE_FS

But it seems the variables are not being 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 keeps changing as well. I'm confused.

Upvotes: 4

Views: 4590

Answers (1)

Mat
Mat

Reputation: 206679

int n = 5;
int Child(void *);
int main() {
    int n = 5;

You have two variables called n. Child operates on the global one, but main uses the one defined in its scope.

You should also change your wait call to waitpid(-1, NULL, __WALL), otherwise you won't actually wait on the cloned process. (Or you could add |SIGCHLD to the clone options.)

From the clone(2) docs:

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

Upvotes: 2

Related Questions