4

我正在尝试使用 clone() 系统调用来创建一个与父进程共享资源的线程。在书中我读到,如果我使用以下标志,我将能够这样做:CLONE_VM | 克隆文件 | 克隆_SIGHAND | 克隆_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));
}

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

4

1 回答 1

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 以外的任何信号,则父进程在使用 wait(2) 等待子进程时必须指定 __WALL 或 __WCLONE 选项。如果未指定信号,则在子进程终止时不会向父进程发出信号。

于 2012-09-16T11:32:53.913 回答