gpt4 book ai didi

C 中的 clone() 系统调用和共享

转载 作者:IT王子 更新时间:2023-10-29 00:36:32 26 4
gpt4 key购买 nike

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

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

最佳答案

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

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

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

来自clone(2)文档:

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.

关于C 中的 clone() 系统调用和共享,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12446455/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com