0

私はオペレーティング システムの入門コースを受講しており、Linux で clone() 呼び出しを使用してスレッドを作成し、それらを使用して何かを行う予定です。clone() を使用するだけで問題が発生しているようです。

クラス ( Course )の名前空間にある単一のクラス ( Homeworkと呼ばれる) にコードを構造化しました。名前空間キーワードを実際に使用したのはこれが初めてであるため、これが問題になる可能性があります。めったにしないことを使って経験を積むようにしているので、ばかげた間違いがあったとしても、それでいいのです。

Web でいくつかの記事を見つけましたが、あまり役に立ちませんでした。man ページを読みましたが、問題が何であるかを理解するのに十分な経験がないと思います。いつか!助けてくれてありがとう:)

クラス内のクローンをキャッチするメソッドが必要です。

// -- Header -- //  
namespace _Course_ {  
    class _Homework_ {  
               ...  
        int threadCatch(void *);  
               ...  
   };  
}

// -- Source -- //  
namespace _Course_ {   
  void _Homework_::threadTest(void) {  
             ...  
     // From web article  
     void **childStack;  
     childStack = ( void **) malloc(KILOBYTE);  
     clone(threadCatch, childStack, CLONE_VM | CLONE_FILES, NULL);  
             ...  
  }  

  int _Homework_::threadCatch(void * ){  
    cout << getpid() << " cloned." << endl;    
    exit(0);  
  }
}

私が現在持っているものです。私はさまざまな方法を試しました(クラスからキャッチャーを取り出し、次に名前空間を取り出します)。2 回コンパイルされますが、make clean 後に再コンパイルしようとすると、関数 (threadCreate) が複数の場所で宣言されていることがわかります。これらの奇妙なエラーのために、私は何か間違ったことをしていると確信しています。何をすべきか、次に何を読むべきか? ありがとう!

4

2 に答える 2

1

clone(2)システム コールは、 C リンケージを持つ関数へのポインタを想定しています。C++ を使用しているため、threadCatch()関数をグローバル名前空間に移動し、関数として宣言することをお勧めしますextern "C"。クラスでメソッドを として宣言することもできますがstatic、C リンケージを持つフリー関数にすることで、関数がパラメーターとして渡される方法とより密接に一致するように感じます。

関数のスコープ外に存在する関数内の C++ オブジェクトを呼び出す必要がある場合はthreadCatch()、それらのオブジェクトへのポインターをargパラメーターとしてclone()呼び出しに渡すことができます。次にthreadCatch()、関数は を適切な型にキャストしargて、それに応じて C++ オブジェクトにアクセスできるようにします。

于 2011-02-09T21:26:32.943 に答える
1

catch 関数を静的クラス関数として定義します。

static int threadCatch(void *);

また (おそらくこれは必要ありませんが、念のためにここで説明します)、スコープ解決演算子を使用して clone() に送信する必要がある場合もあります。あなたはすでに宿題クラスの中でそれを使っているので、私はそうは思いません。念のため言っておきますが、役に立つかもしれません。

clone(Homework::threadCatch, childStack, CLONE_VM | CLONE_FILES, NULL);
于 2011-02-09T21:19:18.687 に答える