分段错误的原因

时间:2011-03-10 04:03:01

标签: c operating-system segmentation-fault clone system-calls

我使用设置了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;  
}  

2 个答案:

答案 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。我很惊讶 错误的非答案。

  • 否,关闭无效文件描述符 在任何UNIX上崩溃 Linux系统存在。
  • 不,void*void**对此问题没有任何关系。
  • 不,你需要获取do_something的地址,编译器会自动为你做这个。

最后,是的:调用close_exitclone()d线程中的任何其他libc例程可能不安全,尽管它不会导致这里的问题。

答案 1 :(得分:-1)

解决问题的方法是将子堆栈实际放在堆栈上......即

  

char child_stack [16384];

我怀疑堆栈指针不能指向数据段或类似......

即便如此..它适用于-g ..但与-O !!!

崩溃