プロセスがメモリのアクセス違反などで落ちた場合、
プロセスの終了コードにはどんな値が入ってくるのでしょうか?
その値はどこかのヘッダで定義されているのでしょうか?

質問の経緯としては、、、
プロセスAは終了時、終了コードをセットして終了します。
で、プロセスBで終了コードをチェックしているのですが、
この場合、アクセス違反などで異常終了したときの終了コードと
プロセスAが設定する値がぶつからないか心配になるり、
質問させていただきました。

識者の方、よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

こんにちは。

itohhといいます。

>アクセス違反などで異常終了したとき
基本的に例外処理を行っていないとシステムで「デバッグするか?」というダイアログを
表示してしまいます。

わたしがよく使う方法は。
例外処理(try、catch)で例外エラーを拾います。そして、エラーコードとメッセージを
取得してexit関数で終了コードを指定するようにします。
(実際のエラーコード、エラーメッセージはNTのイベントログに出力する)

例えば。
正常終了なら0。
異常終了なら1。(エラーによって詳細に分けても良いです。)
などです。

これで、終了を監視しているプロセスで統一したコードが渡ります。

こんな方法では如何でしょうか?

try、catchの使い方は、MSDNライブラリを参照してください。
    • good
    • 0
この回答へのお礼

アドバイスありがとうございました。
参考にさせて頂きます。

お礼日時:2002/04/05 18:12

プロセスステータスは実行環境依存です。


少なくともOSが指定されていないと答えようがありません。

この回答への補足

すみません、その通りです。
書き忘れました。

OSは Windows NT 4.0 です。

補足日時:2002/03/27 15:10
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qプロセスの終了について教えて下さい。

タスクマネージャーにある、プロセスの終了は、どのような時使うのですか。
メモリ使用量の多いところを選択して、・プロセスの終了・をクリックするとパソコンが高速化するとか、、ネット上にでていましたがプロセスの終了とはどのようなことですか。
警告が出るのでまだクリックしたことはありません。

Aベストアンサー

タスクマネージャーでプロセスを強制終了するのは、同時にいくつかアプリケーションを使っているときに、どれかひとつ(複数のこともあります)が異常な動作をしてパソコンが操作できなくなったときに、強制的にそのアプリケーション(プロセス)を停止してパソコンを使えるようにするのが通常の使い方だと思います。
タスクマネージャーではメモリ使用量は分かったっけかなぁ・・・?プロセスがプロセッサを占有している時間的な割合は判別できますけど。いずれにしても、重いアプリ(プロセス)があると分かれば、サービスなりスタートアップの中身を見直して、最初からそのアプリ(プロセス)を起動しないようにする(あるいは稼働時の設定を見直す)のが真っ当な方法と思います。常時タスクマネージャーでプロセスを落とすようなやり方をすると、ファイルシステムやレジストリに訳の分からん異常が蓄積する恐れがありますよ。

Qファイルやディレクトリの存在確認を行う方法

ファイルをオープンするのはfopenでOKですが、ファイルやディレクトリの存在確認を行う方法が知りたいです。

何か組み合わせて作るものなのでしょうか?
perlとか便利な演算子があるのですが、C/C++って器用ではないですね。
これは処理系?依存の内容ですか?

私の環境は VC6, VC2005 Windows2000です。

Aベストアンサー

int access(const char* path, int mode);
int stat(const char* path, struct stat* sb);

かな?
MSDN を引くと _access_s() を使えとか書いてあるけど。

QCOMコンポーネントって何?

よく、COMコンポーネントって聞くんですが、何のことかわかりません。VBやVBAのような言語名ではないことは、なんとなく分かるのですが・・・。できるだけわかりやすく教えてください。

Aベストアンサー

失礼ですが、クラスをご存知ないのであればCOMは多分
全く理解できないでしょうねぇ

クラスについても、ご自分で勉強が必要だとは思いますが
簡単に説明しておきます。
構造体(属性)に、関数(操作)を加え、カプセル化したものです。
従来のプログラミングでは、変数をばらばらに扱わず、
構造体と呼ばれる型に関係ある変数をまとめて、
プログラム中のデータ構造が明確になるようにしておきました。
そこで、この構造体に専属の関数を加えてしまえば、
その構造体は単独で自分の面倒をみることが出来るようになります。
それがクラスです。
その結果、プログラム中のデータや処理が、クラス単位で整理され、
それぞれ部品のように組み替えが可能になりました。

このように、クラス単位にプログラムを分割することで
巨大なプログラムを明瞭にする言語をオブジェクト指向言語といいます。

また、クラスには親と子があり、「継承」という考えを用いて
どんどんバージョンアップや特化を行うことが容易です。

VBで説明すると、
Dim value as A
として変数を宣言した場合、クラスは「A」です。
valueはオブジェクトや、インスタンスと呼ばれます。
valueを使って、Aに含まれる関数を呼び出して、valueを
操作することが出来ます。
value.Init()
等。

ざっくり説明するとこんな感じです。
詳細については、各言語の書籍を参照してください。

このようにして作ったクラスを、
・他の言語から使いたい
・ネットワーク経由で使いたい
などと言った機能を実現する、Microsoft提供の方法の一つが、
COMやDCOMと呼ばれるものです。
COMは、他のプログラムからの使いまわしに強いので、
一度作っておけば、VB、Delphiは勿論、VBScript、JavaScrips、WSHなどから
呼び出しが可能です。
また、COM自体のバージョンが上がっても、それを呼び出してる
プログラム自体には変更の必要がありません。

失礼ですが、クラスをご存知ないのであればCOMは多分
全く理解できないでしょうねぇ

クラスについても、ご自分で勉強が必要だとは思いますが
簡単に説明しておきます。
構造体(属性)に、関数(操作)を加え、カプセル化したものです。
従来のプログラミングでは、変数をばらばらに扱わず、
構造体と呼ばれる型に関係ある変数をまとめて、
プログラム中のデータ構造が明確になるようにしておきました。
そこで、この構造体に専属の関数を加えてしまえば、
その構造体は単独で自分の面倒をみることが出...続きを読む

Qセマフォとmutexの違いは?

排他制御としてセマフォとmutexがありますが、
この二つの違いがよくわかりません。
自分で調べてみたところ、
・セマフォ…プロセス間排他制御。複数ロックがかけられる。
・mutex…スレッド間排他制御。ロックは一つだけ。

と言うような違いがあるようなのですが、これだけの差なんでしょうか?
(これだけの差、と言ってる時点で筋違いだったら申し訳ありません)
また、セマフォをスレッド間排他制御に用いたり、
mutexをプロセス間排他制御に用いることは可能なのでしょうか?
可能だとしたら、これらが2種類存在する理由も教えていただきたいです。

Aベストアンサー

> >一般論としては、Mutexは「カウントを1に限定した」特殊化したSemaphoreです。
> とのことですが、これはWin32以外の環境だと
> これ以上の違いはないと言うことでしょうか?

「一般論」と書いた意味を取り落とされているのではないかと思います。

「一般論としては〇〇」なのですから、「Win32以外の環境」も含めて「各論」では「必ずしも〇〇とは限らない」とご理解ください。

なお、ご指摘のとおり、あるリソースを排他的に利用するだけであればMutexを使用するかわりにカウントが1のSemaphoreを使用することができます。(特定の環境での、MutexとSemaphoreの環境依存の動作を除けば、ですが。)

ではなぜ2種類が用意されている(用意されている環境が存在する)のかといえば、リソースの排他的利用は非常によくあることなので、これに特化した機能を用意すればより良いであろう、というシステムデザイナの判断によるものと考えられます。

ここで言う「より良い」は、あるデザイナにとっては「便利性」、また別のデザイナにとっては「消費リソースが少ない」と、これまた考え方はいろいろでしょう。

> >一般論としては、Mutexは「カウントを1に限定した」特殊化したSemaphoreです。
> とのことですが、これはWin32以外の環境だと
> これ以上の違いはないと言うことでしょうか?

「一般論」と書いた意味を取り落とされているのではないかと思います。

「一般論としては〇〇」なのですから、「Win32以外の環境」も含めて「各論」では「必ずしも〇〇とは限らない」とご理解ください。

なお、ご指摘のとおり、あるリソースを排他的に利用するだけであればMutexを使用するかわりにカウントが1のSemaphore...続きを読む

Q外部exe呼び出しの方法 ShellExecuteEx, System...

VC++6での質問す。
◆やりたいこと◆
(1)内部から外部exeを引数ありで呼び出し、処理をさせます。
(2)その外部exeの結果コードを内部的に受け取り、エラー処理させます。
(3)外部exeの処理実行中は、できればDOS窓を非表示にさせます。

system()呼び出しは最も簡単なのですが、(3)が上手くできませんでした。

◆やってみた方法◆
こちらの過去質問も参考に見よう見まねでShellExecuteExを使ってやってみようとしました。

SHELLEXECUTEINFO sei;
DWORDdwRC;
LPVOID msg;
BOOLres;

ZeroMemory(&sei, sizeof(SHELLEXECUTEINFO));
sei.cbSize = sizeof(SHELLEXECUTEINFO);
sei.nShow = SW_HIDE;
sei.lpVerb = (LPCTSTR)cmd;// cmdの中は、"hoge.exe param1 param2"

res=ShellExecuteEx( &sei );

WaitForSingleObject( sei.hProcess, INFINITE );
GetExitCodeProcess( sei.hProcess, &dwRC );
CloseHandle(sei.hProcess);

if(res != FALSE){
MessageBox( "OK", "result", MB_OK );
}else{
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
dwRC,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR) &msg,
0,
NULL
);
MessageBox( msg, "result", MB_OK | MB_ICONERROR );
LocalFree(msg);
}

以上で実行しようとすると、
「指定されたファイルに対してこの操作を行うアプリケーションが関連付けられていません・・・」
のエラーになってしまいます。
どのように改善していけばよいでしょうか。

ソースはあちこちのものをミックスして書いていて、半分意味も分からずで、とんでもないことをしているかも知れません(VCは初心者で、ハンドルとかクラス、プロセスとかの知識に乏しいです)
また、まったく別で良い方法(CreateProcessの方が簡単だとか)があれば、よろしくお願いします。

VC++6での質問す。
◆やりたいこと◆
(1)内部から外部exeを引数ありで呼び出し、処理をさせます。
(2)その外部exeの結果コードを内部的に受け取り、エラー処理させます。
(3)外部exeの処理実行中は、できればDOS窓を非表示にさせます。

system()呼び出しは最も簡単なのですが、(3)が上手くできませんでした。

◆やってみた方法◆
こちらの過去質問も参考に見よう見まねでShellExecuteExを使ってやってみようとしました。

SHELLEXECUTEINFO sei;
DWORDdwRC;
LPVOID msg;
BOOLres;

ZeroMemory(&se...続きを読む

Aベストアンサー

SHELLEXECUTEINFO構造体に設定する値が間違っています。
この場合は下記の値を設定します。
sei.lpVerb = "open"
sei.lpFile = "hoge.exe"
sei.lpParameters = "param1 param2"

あとGetExitCodeProcess関数を使用するためにPROCESS_QUERY_INFORMATIONアクセス権を割り当てる必要があるのでOpenProcess関数を使用してアクセス権を割り当ててください。

QC# get set

C#でのget setの意味、使い方を教えてください
初心者のため、調べても意味が良く分からず、またどういった場面で利用されるかも分かりません。
有識者の方、よろしくお願い致します。

Aベストアンサー

C#のプロパティという機能はご存知でしょうか?
get、setは、プロパティを実装する際に利用するものです。
getは値の取得、setは値の設定をするものです。

get、setの意味というよりも、プロパティの意味を知ることが大切かと思います。

○意味

プロパティとは、クラスのメンバ変数であるかのようにアクセス可能でありながら、
処理の内容を自分で記述できる機能、、、です(@ITより)。

クラスのメンバ変数をpublicにして公開した場合、どうなるでしょう?
外部から好きなようにメンバ変数の値を変更することができてしまい、
オブジェクト指向という考え方から外れてしまいますよね。

例えばエレベータは、行きたい階のボタンを押せば勝手に運んでくれます。
利用する人は、「ボタンを押す」ということだけ知っていればよく、
ボタンが押された後にどのような仕組みで動くのかを知る必要はありません。

メンバ変数をpublicにして公開するというのは、エレベータの内部構造を公開し、
ボタンではなく、内部構造を直接いじって欲しいというのに似ています。
これだとエレベータが壊れてしまったり、正しく動かなかったりするのは明白です。

前置きが長くなりました^^;
このように、内部実装は隠蔽化すべきというのは分かっていただけたでしょうか。
C#のプロパティは、メンバ変数を隠蔽化する場合に利用する機能なのです。

○使い方

あるクラスに次のようなメンバ変数があったとします。

int code;

この変数は、0~1000までの整数が入るようにしたいという要件があったとします。

public int code;

としてしまうと、外部からcode変数を好き勝手いじられてしまうので、
0~1000までの整数が入るようにしたいという要件は満たせませんし、
そもそも、上記のようにメンバ変数を公開することは推奨されません。

この時、メンバ変数をプロパティとして隠蔽化します。

private int code;

public int Code
{
get
{
return this.code;
}
set
{
if(0 <= value && value <= 1000)
this.code = value;
}
}
※スペースが上手くいれられず申し訳ありません。

#1の方の回答にある

> 代入しようとする値が正しいかどうかチェックする

は、上記ようにsetの処理でチェックを行うことが出来るということです。

利用の仕方は、TextBoxなどのコントロールを使ったことであれば分かりますよね?

長くなってしまいまして、申し訳ありません。
疑問が解消されないようでしたら、その旨をおっしゃってくださいね。

C#のプロパティという機能はご存知でしょうか?
get、setは、プロパティを実装する際に利用するものです。
getは値の取得、setは値の設定をするものです。

get、setの意味というよりも、プロパティの意味を知ることが大切かと思います。

○意味

プロパティとは、クラスのメンバ変数であるかのようにアクセス可能でありながら、
処理の内容を自分で記述できる機能、、、です(@ITより)。

クラスのメンバ変数をpublicにして公開した場合、どうなるでしょう?
外部から好きなようにメンバ変数の値を...続きを読む

QShellExecuteEx関数の使い方について

環境 VC6++/WindowsXP
やりたい事
・FTPで実行するコマンド定義ファイルを作成(コマンドは都度変わる)
・FTPを自動化するために-sオプションをつけ上記ファイル指定して実行
・その(FTP)結果をリダイレクトしてファイルに落とす
・FTPの終了待ってコマンド定義ファイルを削除
・できればDOS窓を出したくない

上記を行うために次の様なコードを書きました
sei.nShow = SW_SHOWNORMAL;
sei.fMask = SEE_MASK_FLAG_DDEWAIT;
ShellExecuteEx(&sei);
WaitForSingleObject(sei.hProcess, INFINITE);

FTPは動作するのですが実際の動作完了前に次の行に実行が移ってしまいます
(FTPは最後にquitします)
何か足りないことがあるのでしょうか?

当初system関数使いましたがDOS窓開くのがうっとおしいため
ShellExecuteExに変更しました
system関数ではDOS窓は出ますが完了まで戻ってきません

何かやらなければいけないことが足りないのか
どうあがいてもできないのか(FTPだから?)が判断付きません
どなたか詳しい方教えていただけないでしょうか
※ 極論言えば目的が達成できればどんな形でもいいので
  関数変えればできるでもいいです

環境 VC6++/WindowsXP
やりたい事
・FTPで実行するコマンド定義ファイルを作成(コマンドは都度変わる)
・FTPを自動化するために-sオプションをつけ上記ファイル指定して実行
・その(FTP)結果をリダイレクトしてファイルに落とす
・FTPの終了待ってコマンド定義ファイルを削除
・できればDOS窓を出したくない

上記を行うために次の様なコードを書きました
sei.nShow = SW_SHOWNORMAL;
sei.fMask = SEE_MASK_FLAG_DDEWAIT;
ShellExecuteEx(&sei);
WaitForSingleObject(sei.hProcess, INFINITE);

...続きを読む

Aベストアンサー

ShellExecuteEx実行後のsei.hProcessが0になっていませんか?
fMaskに指定されているDDEWAITはこの場合は関係ないのではないでしょうか。
NOCLOSEPROCESSを指定してみてはどうでしょう。


人気Q&Aランキング