Interstage Application Server アプリケーション作成ガイド (CORBAサービス編)
目次 索引 前ページ次ページ

第2章 CORBAアプリケーション開発時の留意事項> 2.1 コーディング

2.1.3 子プロセス/スレッドの生成終了処理( C, C++ )


CORBAアプリケーションより生成した子プロセスを終了する際には、exit() ではなく、_exit() を使用するようにしてください。exit() を使用した場合、子プロセスが終了した際に親プロセスも終了したと誤認されてしまい、その後の動作は保証されません。


プロセスモードのサーバアプリケーションから子プロセスを生成する場合はfork()を使用してください。スレッドモードのサーバアプリケーションの場合は、fork()ではなくfork1()を使用してください。

スレッドモードのサーバアプリケーション内から、さらにスレッドを生成する場合は、thr_create() の引数としてTHR_NEW_LWPおよびTHR_BOUNDフラグを指定する必要があります。


 CORBA_ORB_init関数(C++ではCORBA::ORB::init関数)発行後に子プロセスを生成する場合は、_spawn系関数(_spawn関数、_spawnl関数等)は使用しないでください。_spawn系関数はハンドル等を親プロセスから引き継ぐ仕様となっているため、CORBAサービスの制御が正常に行えなくなります。
 CORBA_ORB_init関数(C++ではCORBA::ORB::init関数)発行後にプロセスを生成する場合はCreateProcess関数を使用してください。


 動作モードがSYNC_ENDのサーバアプリケーションの場合、CORBA_BOA_impl_is_ready関数(C++ではCORBA::BOA::impl_is_ready関数)復帰後に、リクエスト処理スレッドがリクエストを処理することはありませんが、OSレベルでスレッドが終了していることは保証しません。
 そのため、dlopen関数で動的に組み込んだライブラリ上の関数をpthread_key_create関数などでスレッド終了時のデストラクタ関数に登録して、CORBA_BOA_impl_is_ready関数復帰後に動的に組み込んだライブラリをdlclose関数で解放した場合、解放済みのライブラリの関数をリクエスト処理スレッドが終了時に発行しようとしてプロセスが異常終了する可能性があります。デストラクタ関数の存在するライブラリはdlclose関数で解放しないでください。


 初期スレッドでpthread_exit()を発行して初期スレッドを終了させた場合、Linuxの仕様によりpsコマンドでプロセスの情報を確認すると<defunct>の表示が現れ、gcoreコマンドやstraceコマンドなどでプロセスの情報を採取することができなくなります。
 gcoreコマンドやstraceコマンドなどでプロセスの情報を採取できないと、トラブルが発生した場合に調査が難しくなるため、アプリケーションを開発する場合は、初期スレッドを終了させないロジックにすることを推奨します。
 例えば、インプリメンテーションの定義で動作モードに“COMPATIBLE”を設定したサーバアプリケーションの場合、サーバアプリケーションの活性化後は初期スレッドが不要となることが一般的です。この場合、動作モードを“SYNC_END”に設定して活性化関数復帰後にプロセスを終了させるよう修正するか、初期スレッドでpthread_exit()を発行せずにsleep()を無限ループするよう修正します。

 
・修正前のソース(動作モード:COMPATIBLE)

int main( int argc, char *argv[] )
{
    /* ORBの初期化処理など */
    CORBA_BOA_impl_is_ready(...); /* 活性化関数(引数は省略) */

    pthread_exit(NULL);
}


・動作モードをSYNC_ENDに設定した場合の修正後のソース

int main( int argc, char *argv[] )
{
    /* ORBの初期化処理など */
    CORBA_BOA_impl_is_ready(...); /* 活性化関数(引数は省略) */

    return 0;
}


・動作モードをCOMPATIBLEから変更しない場合の修正後のソース

int main( int argc, char *argv[] )
{
    /* ORBの初期化処理など */
    CORBA_BOA_impl_is_ready(...); /* 活性化関数(引数は省略) */

    while ( 1 ){
        sleep( 1000 );
    }
}

目次 索引 前ページ次ページ

Copyright 2006 FUJITSU LIMITED