-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

スタックとヒープの主な違いは、関数呼び出しから戻ると、スタック内のものはなくなっていますが、ヒープ内のものはそこにとどまります。

たとえば、次の関数では:

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

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

}

関数が終了した後、b はまだ文字列を指していますが、a は完全になくなっています。

2 番目の質問については、を使用しない限り、子スレッドは親スレッドに依存しませんthread_join。ただし、メイン プロセスが終了するとすぐにすべてのスレッドが停止します。

于 2012-10-17T19:19:34.203 に答える
1

セグメンテーション違反の原因を突き止めるには、コードをデバッグ フラグ ( -g)でコンパイルし、 Valgrind の memcheck ツール内で実行してみてください。

于 2012-10-17T19:28:32.597 に答える
0
  1. mallocで作成されたメモリはヒープに保存されます。ヒープは、解放されて明示的に破棄されるまで使用できます。これが、スタックに変数を作成する代わりに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 に答える