プロセスの制御

この節では,他のプロセスを起動したり終了したりするために使う関数に ついて説明します.



::wxExecute



long wxExecute(const wxString& command, int sync = wxEXEC_ASYNC, wxProcess * callback = NULL)

wxPerl での注意点: wxPerl では,この関数はWx::ExecuteCommand という 関数名です.



long wxExecute(char ** argv, int flags = wxEXEC_ASYNC, wxProcess * callback = NULL)

wxPerl での注意点: wxPerl では Wx::ExecuteArgs という関数名です.



long wxExecute(const wxString& command, wxArrayString& output, int flags = 0)

wxPerl での注意点: wxPerl ではWx::ExecuteStdout という関数名で, command だけを引数にとり,二つの要素 ( status, output ) からなるリストを返します.output は 配列への参照になります.



long wxExecute(const wxString& command, wxArrayString& output, wxArrayString& errors, int flags = 0)

wxPerl での注意点: wxPerl では Wx::ExecuteStdoutStderr という関数名で, command だけを引数にとり,三つの要素 ( status, output, errors ) からなるリストを返します. output および errors は配列への参照になります.

Unix または Windows で他のプログラムを実行します.

最初の形式では "emacs file.txt" のようなコマンドライン文字列を 引数にとります.

二つ目の形式では,コマンドラインを構成する値からなる配列を引数に取ります: 引数はコマンド自体,任意の数の引数からなり,NULL で終端されています.

三つ目および四つ目の形式では,前者の二つの形式とはすこしセマンティクスが 異なり,詳しくは以下のようになります.

flags パラメタに wxEXEC_ASYNC フラグが設定されている 場合 (デフォルトでは設定されています),関数は即座に処理を戻します. wxEXEC_SYNC フラグが設定されていれば,アプリケーションは 起動したプログラムが終了するまで待機します.

同期的な実行を行う場合,戻り値はプロセスの終了コードになり (起動されたプロセスは関数が処理を戻す前に終了しています) , プロセスを起動できなかった場合には -1 を,プロセスが正常に終了 した場合には通常は 0 を返します.また,プロセスの終了を待つ間, wxExecute は wxYield を呼び出します. このため,デフォルトではこの関数は全てのアプリケーションウィンドウを 一時的に操作不可にして,子プロセスの実行中にユーザが プログラムを操作して予期せぬ再入を起こすのを避けます. ウィンドウを操作不可にしなくても安全であるとはっきり分かっている場合, wxEXEC_NODISABLE フラグを渡してこの機能を無効にできます.

一方,非同期的な実行を行う場合には,戻り値はプロセスの id になります. 戻り値がゼロの場合,コマンドを実行できなかったことを示します. さらにややこしいことに,戻り値が -1 の場合は,新たなプロセスを起動 できなかったが,現在実行中のプロセスに接続できたことを示します (Windows でコマンドの実行に DDE を使うと起きることがあります) . とりわけ,この場合には,呼び出し側のコードはプロセス終了時の通知を 受け取れません.

callback が NULL でなく,実行を非同期的に行った場合, プロセスの終了時にwxProcess::OnTerminate が呼び出されます.また,このパラメタを設定すると, Redirect を呼び出して,起動するプロセスの 標準入力および出力をリダイレクトできます.子プロセスの IO をリダイレクト すると, Windows のデフォルトの設定下ではプロセスのウィンドウは表示 されません (ウィンドウを生成しないようなプロセスで,不要なコンソールが 更新されるのを防ぐためです) が,wxEXEC_NOHIDE フラグを使うと この挙動を抑制できます.すなわち,このフラグを設定すると,子プロセスの ウィンドウも通常通り表示されます.

Unix では, wxEXEC_MAKE_GROUP_LEADER フラグを使って,新たな プロセスがグループリーダとなるよう保証できます (必要なら,新たな セッションを作成します).wxKILL_CHILDREN を渡して wxKill を呼び出すと, プロセスの終了時に該当するプロセスとその全ての子プロセスを (独自のセッション下で起動したものを除き) 終了させます.

最後に,三つ目の関数を使った場合,プロセスを (flagswxEXEC_SYNC を加えた場合には常に同期的に) 実行 して,その出力を配列 output に取り込めます.四つ目の形式には, さらに標準エラー出力を配列 errors に取り込む機能もあります.

NB: 現在のところ, wxExecute() は主スレッド (main thread) で のみ利用でき,それ以外のスレッドで wxExecute() を呼び出した場合, デバッグビルドではアサーション失敗を引き起こしてうまく動作しません.

See also

wxShell, wxProcess, Exec sample.

Parameters

command
実行するコマンドと任意のパラメタを単一文字列に したものです.

argv
実行するコマンドが先頭の要素,それ以降の要素である ような配列です.配列は NULL で終端されていなければなりません.

flags
ビットマスク wxEXEC_ASYNC, wxEXEC_SYNC および wxEXEC_NOHIDE を組み合わせたものです.

callback
wxProcess へのポインタです.

Include files

<wx/utils.h>



::wxExit



void wxExit(void)

wxApp::OnExit を呼び出した後,アプリケーションを 終了します.この関数は緊急時用です: 通常はトップレベルのフレームを (他のフレームを削除した後で) 削除してアプリケーションを終了して ください. wxCloseEvent および wxApp も参照してください.

Include files

<wx/app.h>



::wxKill



int wxKill(long pid, int sig = wxSIGTERM, wxKillError *rc = NULL, int flags = 0)

Unix における kill と同じです: sig に指定したシグナルを PIDが pid のプロセスに送信します.利用できるシグナルを 以下に示します.

enum wxSignal
{
    wxSIGNONE = 0,  // Unix で,プロセスが終了しているか確かめる
    wxSIGHUP,
    wxSIGINT,
    wxSIGQUIT,
    wxSIGILL,
    wxSIGTRAP,
    wxSIGABRT,
    wxSIGEMT,
    wxSIGFPE,
    wxSIGKILL,      // 強制的な kill,危険!
    wxSIGBUS,
    wxSIGSEGV,
    wxSIGSYS,
    wxSIGPIPE,
    wxSIGALRM,
    wxSIGTERM       // 行儀よくプロセスを終了させる
};

wxSIGNONE, wxSIGKILL および wxSIGTERM は Unix と Windows で同じ意味を持っていますが,その他のシグナルは Windows 下では wxSIGTERM と同じになります.

成功すると 0 を,失敗すると -1 を返します. rc パラメタを NULL 以外の値にする場合,以下の列挙型 wxKillError のいずれかの値に せねばなりません:

enum wxKillError
{
    wxKILL_OK,              // no error
    wxKILL_BAD_SIGNAL,      // no such signal
    wxKILL_ACCESS_DENIED,   // permission denied
    wxKILL_NO_PROCESS,      // no such process
    wxKILL_ERROR            // another, unspecified error
};

The flags parameter can be wxKILL_NOCHILDREN (the default), or wxKILL_CHILDREN, in which case the child processes of this process will be killed too. Note that under Unix, for wxKILL_CHILDREN to work you should have created the process by passing wxEXEC_MAKE_GROUP_LEADER to wxExecute.

See also

wxProcess::Kill, wxProcess::Exists, Exec sample

Include files

<wx/utils.h>



::wxGetProcessId



unsigned long wxGetProcessId(void)

システム内で現在のプロセスを一意に表すような数値を返します.

えらーが生じると 0 を返します.

Include files

<wx/utils.h>



::wxShell



bool wxShell(const wxString& command = NULL)

対話シェルウィンドウ内でコマンドを実行します. コマンドを指定しない場合,シェルの起動だけを行います.

wxExecuteExec sample も参照してください.

Include files

<wx/utils.h>



::wxShutdown



bool wxShutdown(wxShutdownFlags flags)

flags の値に従ってコンピュータをシャットダウンしたり再起動したり します.この操作を行うには,適切なアクセス権限 (Unix ではスーパユーザ権限, Windows NT では SE_SHUTDOWN 権限) を持っていなければならず, かつこの関数は Unix と Win32 でだけ実装されているので注意してください.

Parameters

flags
Either wxSHUTDOWN_POWEROFF or wxSHUTDOWN_REBOOT

Returns

成功時にはtrue を,失敗時にはfalse を返します.

Include files

<wx/utils.h>

ymasuda 平成17年11月19日