我使用设置了CLONE_VM和CLONE_FILES的clone()系统调用编写了一个程序。 我无法理解为什么输出显示Segmentation Fault。有人可以纠正我的代码并告诉我相同的原因。
#include<stdio.h>
#include<unistd.h>
#include<fcntl.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<sched.h>
#include<stdlib.h>
int variable, fd;
int do_something() {
// sleep(100);
variable = 42;
close(fd);
_exit(0);
}
int main(int argc, char *argv[]) {
void **child_stack;
char tempch;
variable = 9;
fd = open("test.file", O_RDONLY);
child_stack = (void **) malloc(16384);
printf("The variable was %d\n", variable);
clone(do_something, child_stack, CLONE_VM|CLONE_FILES, NULL);
// sleep(100);
printf("The variable is now %d\n", variable);
if (read(fd, &tempch, 1) < 1) {
perror("File Read Error");
exit(1);
}
printf("We could read from the file\n");
return 0;
}
答案 0 :(得分:4)
您需要知道处理器上哪个方向堆栈增长,并且您需要知道必须传递给堆栈的哪一端克隆()。
来自man clone
:
Stacks grow downwards on all processors that run Linux (except the
HP PA processors), so child_stack usually points to the topmost
address of the memory space set up for the child stack.
你不传递最顶层的地址,你传递的是最底层的地址,而你不是(我猜)在HP-PA上。
修正:
child_stack = (void **) malloc(16384) + 16384 / sizeof(*child_stack);
P.S。我很惊讶 错误的非答案。
void*
与void**
对此问题没有任何关系。最后,是的:调用close
,_exit
或clone()d
线程中的任何其他libc例程可能不安全,尽管它不会导致这里的问题。
答案 1 :(得分:-1)
解决问题的方法是将子堆栈实际放在堆栈上......即
char child_stack [16384];
我怀疑堆栈指针不能指向数据段或类似......
即便如此..它适用于-g ..但与-O !!!
崩溃