・ジョブオブジェクト ジョブオブジェクトは、複数のプロセスを一度に管理するためのオブジェクトである。複 数のプロセスをグループ化して管理したいアプリケーションは、CreateJobObjectでジョ ブオブジェクトを作成し、AssignProcessToJobObjectでそれぞれのプロセスをジョブオブ ジェクトに関連付ける。既存のジョブオブジェクトをオープンするには、OpenJobObject を使用する。 ----------------------------------------------------------------------------- ○CreateJobObject ジョブオブジェクトの作成 Cの宣言: HANDLE CreateJobObject( LPSSECURITY_ATTRIBUTE SecurityAttributes, LPCTSTR JobName); 説明: JobNameで指定した名前を持つジョブオブジェクトを作成する。すでにJobNameで指定した 名前を持つジョブオブジェクトが存在する場合、そのジョブオブジェクトをオープンし、 ハンドルを返す。 この関数はNT5.0で使用可能。 JobNameに指定する名前は、同期オブジェクトと同じ名前空間を使用していることに注意 。JobNameにはNULLを指定可能。その場合、名前無しジョブオブジェクトが作成される。 作成したジョブオブジェクトをクローズするには、CloseHandleを使用する。 引数の意味は以下の通り。 SecurityAttributes 作成するジョブオブジェクトのセキュリティ属性。 JobName 作成するジョブオブジェクトの名前。 戻り値は、作成またはオープンしたジョブオブジェクトのハンドルである。関数の実行に 失敗した場合、NULLが返される。 ○AssignProcessToJobObject ジョブオブジェクトにプロセスを追加 Cの宣言: BOOL AssignProcessToJobObject( HANDLE hJob, HANDLE hProcess); 説明: hJobで指定したジョブオブジェクトへ、hProcessで指定したプロセスを関連付ける。 この関数はNT5.0で使用可能。 引数の意味は以下の通り。 hJob 関連付ける先のジョブオブジェクトのハンドル hProcess 関連付けるプロセスのハンドル。 戻り値は、関数の実行に成功したか否かを表す真偽値である。 ○OpenJobObject ジョブオブジェクトのオープン Cの宣言: HANDLE OpenJobObject( DWORD fAccess, DWORD fInherit, LPCTSTR sJobName); 説明: ジョブオブジェクトをオープンし、そのハンドルを取得する。 この関数はNT5.0で使用可能。 引数の意味は、以下の通り。 fdwAccess (IN) ジョブオブジェクトをどのように使用するかを指定するフラグ。指定で きるフラグは後述の表を参照。 fInherit (IN) 取得結果のハンドルが継承可能か否かを表す真偽値。 sMutexName (IN) オープンするジョブオブジェクトの名前。名前は、大文字・小文字が区 別される。 fdwAccessに指定可能な値は、以下の論理和である。 MAXIMUM_ALLOWED JOB_OBJECT_ASSIGN_PROCESS JOB_OBJECT_SET_ATTRIBUTES JOB_OBJECT_QUERY JOB_OBJECT_TERMINATE JOB_OBJECT_ALL_ACCESS 戻り値は、オープンしたジョブスオブジェクトのハンドルである。ジョブオブジェクトの オープンに失敗した場合、NULLが返される。 ----------------------------------------------------------------------------- ジョブオブジェクトとプロセスを関連付けたら、関連を破棄することはできないので注意 。ジョブオブジェクトに関連付けられているプロセスが作成した子プロセスは、自動的に そのジョブオブジェクトと関連付けられる。一つのプロセスは、複数のジョブオブジェク トに関連付けることはできない。 ・プロセス群の制御 ジョブオブジェクトと関連付けられたプロセスに対して、種々の制限を適用させることが できる。この例としては、ワーキングセットサイズやプロセスの優先順位などが挙げられ る。制限を課すにはSetInformationJobObjectを使用する。 具体的に課される制限には、基本的な制限とユーザインターフェースに対する制限が挙げ られる。基本的な制限は、SetInformationJobObjectにJobObjectBasicLimitInformation 渡すことにより、適用される。ユーザインターフェースに対する制限は、JobObjectBasic UIRestrictionを渡すことによって適用される。それぞれの制限の詳細は以下の通り。 基本的な制限 (1)プロセスを強制的に終了させる時間。この時間を過ぎると、プロセスは終了する。時 間の指定方法には、それぞれのプロセスごとのユーザ時間、または、プロセス群のユーザ 時間の総計のいずれも指定可能。 (2)ワーキングセットサイズの最大サイズおよび最小サイズ (3)同時にアクティブにできるプロセスの最大の個数 (4)どのプロセッサ上で動作させるか (5)プロセスの優先クラス ユーザインターフェースに対する制限 (1)ログオフやシャットダウンの抑止 (2)ジョブオブジェクトに関連付けられていないプロセス群が使用しているユーザハンド ルを、プロセス群中で使用できない様にする。この制限が課されているときに、他のプロ セスのユーザハンドルへのアクセス権を与えるには、UserHandleGrantAccessを使用する 。(そのプロセス群からは使用できない) (3)クリップボードからのデータの読み込み。および、クリップボードへのデータの書き 込み。 (4)システム情報の変更 時間に関する制限が設定されているジョブオブジェクトには、新たにプロセスを関連付け ることはできない。 ----------------------------------------------------------------------------- ○SetInformationJobObject ジョブオブジェクトの制限の設定 Cの宣言: BOOL SetInformationJobObject( HANDLE hJob, JOBOBJECTINFOCLASS JobInfoClass, LPVOID JobInfo, DWORD JobInfoSize); 説明: hJobで指定されたジョブオブジェクトに対して、JobInfoで指定した制限を設定する。 この関数はNT5.0で使用可能。 引数の意味は以下の通り。 hJob 設定先のジョブオブジェクトのハンドル JobInfoClass 設定する制限の種別。後述の表を参照。 JobInfo 設定する制限。 JobInfoSize JobInfoのサイズ。 JobInfoClassに指定可能なフラグは以下の値のいずれかである。 JobObjectBasicLimitInformation JobInfoはJOBOBJECT_BASIC_LIMIT_INFORMATION構造体 のポインタ。 JobObjectBasicUIRestrictions JobInfoはJOBOBJECT_BASIC_UI_RESTRICTIONS構造体のポ インタ。 戻り値は、関数の実行に成功したか否かを表す真偽値である。 ○UserHandleGrantAccess ジョブオブジェクトに対するユーザオブジェクトのハンドルの アクセス許可 Cの宣言: BOOL UserHandleGrantAccess(HANDLE hUserObject, HANDLE hJob); 説明: hJobで指定したジョブオブジェクトに関連付けられているプロセス群に対して、hUserObj ectで指定されるユーザオブジェクトのハンドルを使用可能にする。 この関数はNT5.0以降で使用可能。 本関数の呼び出し元プロセスは、hJobに関連付けられていてはいけない。 引数の意味は以下の通り。 hUserObject アクセスを許可するユーザハンドル。 hJob 許可先のジョブオブジェクトのハンドル。 戻り値は、関数の実行に成功したか否かを表す真偽値である。 ----------------------------------------------------------------------------- 現在ジョブオブジェクトが、関連するプロセス群に課している制限の情報を取得するには QueryInformationJobObjectを使用する。QueryInformationJobObjectは、上述の制限に関 する情報を取得するほか、プロセスの経過時間や、プロセスIDのリストなどの情報を取得 することができる。 ----------------------------------------------------------------------------- ○QueryInformationJobObject ジョブオブジェクトに設定されている制限情報の取得 Cの宣言: BOOL QueryInformationJobObject( HANDLE hJob, JOBOBJECTINFOCLASS JobInfoClass, LPVOID JobInfo, DWORD JobInfoSize, LPDWORD ReturnSize); 説明: hJobで指定されたジョブオブジェクトの情報を取得し、結果をJobInfoに返す。 この関数はNT5.0で使用可能。 引数の意味は以下の通り。 hJob 情報の取得元のジョブオブジェクトのハンドル。NULLを指定した場合、呼び出し元 のプロセスが関連付けられているジョブオブジェクトから情報を取得する。 JobInfoClass 取得する情報の種別。後述の表を参照。 JobInfo 取得結果の情報 JobInfoSize JobInfoのサイズ。 ReturnSize 実際にJobInfoに設定されたデータのサイズ。NULLを指定可能。 JobInfoClassに設定可能なフラグは以下のいずれかである。 JobObjectBasicAccountingInformation 経過時間やプロセス数などの情報を取得する。Jo bInfoにはJOBOBJECT_BASIC_ACCOUNTING_INFORMATION構造体の情報が返される。 JobObjectBasicLimitInformation JobInfoにはJOBOBJECT_BASIC_LIMIT_INFORMATIONの情 報が返される。 JobObjectBasicProcessIdList 関連付けられているプロセスのIDの一覧を取得する。JobI nfoにはJOBOBJECT_BASIC_PROCESS_ID_LIST構造体の情報が返される。 JobObjectBasicUIRestrictions JobInfoにはJOBOBJECT_BASIC_UI_RESTRICTIONSの情報が 返される。 戻り値は、関数の実行に成功したか否かを表す真偽値である。 ----------------------------------------------------------------------------- ・プロセス群の終了 ジョブオブジェクトと関連付けられているプロセス群を、いっせいに終了させることがで きる。これには、TerminateJobObjectを使用する。 ----------------------------------------------------------------------------- ○TerminateJobObject ジョブオブジェクトに関連付けられているプロセス群の終了 Cの宣言: BOOL TerminateJobObject(HANDLE hJob, UINT ExitCode); 説明: hJobで指定したジョブオブジェクトに関連付けられている全てのプロセスを終了する。 この関数はNT5.0以降で使用可能である。 引数の意味は以下の通り。 hJob 終了するプロセス群が関連付けられているジョブオブジェクトのハンドル。 ExitCode プロセスの終了時の終了コード。 戻り値は、関数の実行に成功したか否かを表す真偽値である。 -----------------------------------------------------------------------------