-2

我的代码中有“分段错误”。我很好奇我是否在函数中使用“malloc()”分配了一些空间。功能完成后,空格还有效吗?进一步的问题,当创建这样的子线程时,我想它即使在其父级退出后也存在。我在 Linux 中使用 GCC。

void foo(){
    void *child_stack;
    child_stack=(void*)malloc(16384);
    child_stack += 16384;
    clone((void*)do_function,child_stack,0,NULL);
}
4

3 回答 3

2

Stack 和 Heap 之间的主要区别在于,当您从函数调用返回时,堆栈中的内容已经消失,但堆中的内容仍然存在。

例如,在以下函数中:

void test_func() 
{
   char a[20];  //using stack
   char *b = malloc(20); //using heap

   strcpy(a, "test string");
   strcpy(b, "test string");

}

函数完成后,b 仍然指向字符串,但 a 完全消失了。

对于第二个问题,子线程不会依赖于父线程,除非您使用thread_join. 但是,一旦主进程完成,所有线程都会停止。

于 2012-10-17T19:19:34.203 回答
1

要找到分段错误的原因,您可以尝试使用调试标志 () 编译代码并在Valgrind 的 memcheck 工具中-g运行它。

于 2012-10-17T19:28:32.597 回答
0
  1. 使用 malloc 创建的内存在堆上,直到它被 free 显式销毁之前都是可用的。这是使用 malloc 而不是在堆栈上创建变量的主要原因,这些变量在超出范围时被销毁(例如,函数返回)并且堆栈帧被销毁。段错误可能是因为您分配了 16384 字节,然后使用 += 将指针向前移动 16384(为什么要这样做?),然后再将其传递给可能试图访问它的函数。

  2. 我不是 100% 确定,但是从 wait() 手册页,

    If a parent process terminates, then its "zombie" children (if any) are adopted by init(8), which automatically performs a wait to remove the zombies.
    
于 2012-10-17T19:12:49.147 回答