克隆()系统调用C和共享

时间:2012-09-16 11:25:24

标签: c linux clone fork

我正在尝试使用clone()系统调用来创建一个与父进程共享资源的线程。 在本书中,我读到如果我使用以下标志,我将能够这样做: CLONE_VM | CLONE_FILES | CLONE_SIGHAND | CLONE_FS

但似乎变量没有被分享。

#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));
}

输出也在不断变化。我很困惑。

1 个答案:

答案 0 :(得分:2)

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

您有两个名为n的变量。 Child在全局范围内运行,但main使用其范围内定义的范围。

您还应该将wait来电更改为waitpid(-1, NULL, __WALL),否则您实际上不会等待克隆过程。 (或者您可以将|SIGCHLD添加到克隆选项中。)

来自clone(2)文档:

  

flags的低字节包含发送到的终止信号的编号          孩子去世时的父母。如果此信号被指定为其他信号          而不是SIGCHLD,那么父进程必须指定__WALL或__WCLONE          等待孩子等待时的选项(2)。如果没有指定信号,          然后,当孩子终止时,不会发出父进程的信号。