ホームに戻る
16、プロセス
プロセスはWindowsの管理により切りかえられる。
この切り替えを頻繁に行うことによって、
多数のプロセスが同時に動いているように見える。
プロセスは一定時間の数十ナノ秒ごとに切りかえられるが、
プロセスがアイドル状態であれば一定時間を待たず切り替えられる。
この管理はOSによる。
プロセスは最初は WinMain から始まる1つのスレッドを持つ、
プロセスの切り替えはスレッドの切り替えより遅い。
プロセスはアイコンのクリックによって起動されるが、
プロセス内からも他のプロセスとして起動が可能である。
起動するために CreateProcess というAPIを用いる。
BOOL CreateProcess(
LPCTSTR lpApplicationName, // 実行可能モジュールの名前
LPTSTR lpCommandLine, // コマンドラインの文字列
LPSECURITY_ATTRIBUTES lpProcessAttributes, // セキュリティ記述子
LPSECURITY_ATTRIBUTES lpThreadAttributes, // セキュリティ記述子
BOOL bInheritHandles, // ハンドルの継承オプション
DWORD dwCreationFlags, // 作成のフラグ
LPVOID lpEnvironment, // 環境変数
LPCTSTR lpCurrentDirectory, // カレントディレクトリの名前
LPSTARTUPINFO lpStartupInfo, // スタートアップ情報
LPPROCESS_INFORMATION lpProcessInformation // プロセス情報
);
lpApplicationName:通常は NULL。
lpCommandLine:引数も含めたコマンドライン。
lpProcessAttributes:通常は NULL。
lpThreadAttributes:通常は NULL。
bInheritHandles:通常は FALSE。
dwCreationFlags:通常は 0。
lpEnvironment:環境変数を与える。NULL で現在のものと同じになる。
lpCurrentDirectory:カレントディレクトリを与える。NULL で現在のものと同じになる。
lpStartupInfo:プロセスに情報を与える。
lpProcessInformation:プロセスの情報を得る。
戻り値は、
成功すると 0 以外の数値。失敗で 0 を返す。
プロセスを作成して受け取ったプロセス情報から、
プロセスのスレッドやプロセス自体のハンドルを得ることができる。
このハンドルは呼び出し元で利用しなければすぐに閉じても良い。
閉じてしまっても呼び出し先でハンドルが閉じてしまうことは無い。
プロセスのハンドルはプロセスが終了したかどうかを知るために利用できる。
WaitForSingleObject を使うことで終了を待ち、
GetExitCodeProcess で終了コードを得ることができる。
DWORD res;
PROCESS_INFORMATION pi;
STARTUPINFO si;
ZeroMemory(&si, sizeof(si));
si.cb=sizeof(si);
CreateProcess(NULL, "", NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
CloseHandle(pi.hThread);
if(WaitForSingleObject(pi.hProcess, INFINITE) == WAIT_OBJECT_0){
GetExitCodeProcess(pi.hProcess, &res);
}
CloseHandle(pi.hProcess);