4

clone() システムコールを使用して、親プロセスとリソースを共有するスレッドを作成しようとしています。私が読んだ本では、次のフラグを使用すると、それが可能になると書かれています。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));
}

出力も変化し続けます。よくわかりません。

4

1 に答える 1

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

という 2 つの変数がありますnChildグローバルなもので動作しますがmain、そのスコープで定義されたものを使用します。

waitまた、呼び出しをに変更する必要がありますwaitpid(-1, NULL, __WALL)。そうしないと、実際には複製されたプロセスを待機しません。|SIGCHLD(または、クローン オプションに追加することもできます。)

clone(2)ドキュメントから:

flags の下位バイトには、子が死亡したときに親に送信される終了シグナルの数が含まれます。このシグナルが SIGCHLD 以外のものとして指定されている場合、親プロセスは、wait(2) で子プロセスを待機するときに __WALL または __WCLONE オプションを指定する必要があります。シグナルが指定されていない場合、子プロセスが終了したときに親プロセスにシグナルが送信されません。

于 2012-09-16T11:32:53.913 に答える