FC2ブログ

[Win32API][Winsock][Development]WSAGetLastError()

 Windowsのネイティブで開発をしている(.NET 上のCLRではなく)と、エラーコードが、「誰の」エラーコードであるかということを理解していないとデバッグに困ってしまう。
 WSAGetLastError()は、このSocket APIを呼び出したスレッド上でのWinsockエラーコードのようだ。つまり内部的には、TLS(Thread LocalStorage)にエラーコードを保存しているように振舞っている。
 これは、プロセス単位のエラーコードではないということだ。スレッドAの上でWinsockエラーが起きた直後に、スレッドB上でWSAGetLastError()を実行しても、信頼できるエラーコードが取得できないということを意味する。
 .NET FrameworkやMFCのメッセージマップを使っていたり、スレッドプールをバリバリ使っているようなプログラムだと、とくに問題になりそうな予感がする。
 エラー処理をする際には、「誰が」エラーを引き起こしたのか、「誰の」エラーコードを参照したのか、ということを意識しなければならない。スレッド構成が複雑なプログラムであればなおのことこれは難しい問題となるだろう。
 だからこそ、マルチスレッドは難しい、と言われるゆえんなのだが。
スポンサーサイト



more...

FC2ブックマーク | この記事をokyuuへインポート | このエントリーを含むはてなブックマーク | ニフティクリップへ追加 | この記事をクリップ! | イザ!ブックマーク | POOKMARK Airlinesに登録する | del.icio.us |
動作未検証 | | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証

GetStdHandle(STD_OUTPUT_HANDLE)とprintf

 ちょっと検証用にprintfの出力を物理ファイルにリダイレクトしてみようと思ったが、どうもそう単純な話でもないらしい。
 SetStdHandle()を単純に実行するだけでは標準出力を物理ファイルに振り向けることはできないことがあるようだ。
 原因はいまいちよくわからないが、printf()が内部的にstdoutのハンドルを複製していて、SetStdhandle()の影響を受けないように保護しているのかもしれない。
 まあ、stdoutをソケットにリダイレクトすれば、ネットワーク経由でコンソール操作がだだもれになるわけだし、セキュリティの観点からはそういう実装のほうが正しいのかも。(環境はXP SP3、開発はVS2008)

theme : プログラミング
genre : コンピュータ

FC2ブックマーク | この記事をokyuuへインポート | このエントリーを含むはてなブックマーク | ニフティクリップへ追加 | この記事をクリップ! | イザ!ブックマーク | POOKMARK Airlinesに登録する | del.icio.us |
動作未検証 | | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証

ディレクトリの存在チェック

ディレクトリの存在チェック (株式会社ディア Dear inc.)

 CreateFile(Ex)でディレクトリの存在チェックをするサンプルですが、オプション引数にFILE_FLAG_BACKUP_SEMANTICSという値を使用しています。
 この引数をOPEN_EXISTINGにすると失敗することがある(ACCESS_DENIED)のですが、その原因は何なんでしょうか。
 まあ、ACCESS_DENIEDであれば、ディレクトリが存在することだけは間違いないのですが。
 何か、別のプロセスがアクセスしっぱなしなんですかねぇ。

FC2ブックマーク | この記事をokyuuへインポート | このエントリーを含むはてなブックマーク | ニフティクリップへ追加 | この記事をクリップ! | イザ!ブックマーク | POOKMARK Airlinesに登録する | del.icio.us |
動作未検証 | | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証

[Win32API]Get/SetEnvironmentVariable()

 Win32API経由で環境変数を設定する方法として知られているのが、Get/SetEnvironmentVariable()。しかし、これらのAPIはプログラム内でのみ変更が有効になるもので、システム環境変数には影響が及ばない。
 そのため、PATH環境変数を設定して外部プログラムからのDLLサーチパスを追加する、といったことをやりたいときには、この方法は使えない。
 ならば、どうしなければならないかというと、システム環境変数はレジストリの中に実体があるので、レジストリに対して変更を行えばいい。
 ちなみに、レジストリ上のパスは HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment\Path

theme : プログラミング
genre : コンピュータ

FC2ブックマーク | この記事をokyuuへインポート | このエントリーを含むはてなブックマーク | ニフティクリップへ追加 | この記事をクリップ! | イザ!ブックマーク | POOKMARK Airlinesに登録する | del.icio.us |
動作未検証 | | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証

[Win32]STATUS_STACK_BUFFER_OVERRUN

 0xC~はシステム例外、0xE~はアプリケーション例外(アプリケーション製作者が独自に定義した例外)であり、エラールックアップなどではコードの意味が調べられない。
 というわけで、備忘録をかねて、自分が発見したWindowsの例外コードと調査結果については、当ブログでも継続的に取り扱っていこうと考えている。

more...

theme : プログラミング
genre : コンピュータ

FC2ブックマーク | この記事をokyuuへインポート | このエントリーを含むはてなブックマーク | ニフティクリップへ追加 | この記事をクリップ! | イザ!ブックマーク | POOKMARK Airlinesに登録する | del.icio.us |
動作未検証 | | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証

[Development][VC++] 意図的にデッドロックを発生させる

 変なコードですが、擬似的な親子二つのプロセスを立ち上げて、一方が他方のプロセスを監視しています(実際にプロセス間に親子関係があるわけではありません)。
 先に疑似親プロセスを起動し、続いて疑似子プロセスを起動します。
 疑似親子プロセスの間で意図的にデッドロックを発生させています。そのため、疑似子プロセスが消滅(このままだとCTRL+Cなどで意図的に停止しないといけませんが)すると、デッドロック状態が解消され疑似親プロセスも正常終了します。

 これら二つのプロセスはどちらも同じ実行ファイルから起動します。疑似親プロセスの起動には/pスイッチを使用して、疑似子プロセスの起動には/cスイッチを使用します。

 これだけではほとんど意味はありませんが、常時疑似子プロセスを監視して、疑似子プロセスが消滅した時点で疑似親プロセスに何らかの処理をさせることができます。(こういう場合、ふつうはプロセスのハンドルを取得すると思いますがね・笑)

 最後に、疑似親プロセスが、500msecごとにWaitをLoopさせていますが、疑似子プロセスがミューテックスハンドルを握り込んだまま消滅するとオブジェクトの状態が怪しくなるためです。当初は疑似子プロセスが終了したところでWAIT_ABANDONEDが返ってくると予想していたのですが、私がタメしたXP SP3上ではそのまま疑似親プロセスがロックされていました。

 ふつうはシステムオブジェクトをロックしたままプロセスを終了させるような凶悪なことはせず、この場合は疑似子プロセスのプロセスハンドルをWaitすると思います。その場合、疑似子プロセスが終了したところでロックが解除され、WAIT_OBJECT_0が返ってくるでしょう。

more...

FC2ブックマーク | この記事をokyuuへインポート | このエントリーを含むはてなブックマーク | ニフティクリップへ追加 | この記事をクリップ! | イザ!ブックマーク | POOKMARK Airlinesに登録する | del.icio.us |
動作未検証 | | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証

[Other]209/8/28 第6回UMTPモデリング技術セミナー、参加レポート

 UMTP Japan - UMTPモデリング技術セミナー 第6回開催(2009-08-28)のご案内

に、参加してきました。

 会場はオフィス内でしたので、周辺写真等は撮影しておりません(もっとも、有名なビル街のまっただ中ですので、場所の特定は簡単ですね)。

 当日は快晴で、とても暑い一日でした。開始時間が13:30ということで、すこし前までお昼の時間帯でしたから、エキナカから地下道を通ってビルに到着するまで、かなりの人混みだったことを覚えています。

 このセミナーは、主にUMTP L2合格者を対象としたものだそうで、中心としているテーマは要件定義でした。その中で、UMLを拡張したsysMLという表記法をご紹介いただきました。

more...

FC2ブックマーク | この記事をokyuuへインポート | このエントリーを含むはてなブックマーク | ニフティクリップへ追加 | この記事をクリップ! | イザ!ブックマーク | POOKMARK Airlinesに登録する | del.icio.us |
動作未検証 | | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証

[Windows][Visual Studio 2008][VC++]signal(CRT)

 VC++環境でsignalの動作を確認してみた。
 サンプルは、無限ループでひたすらコンソールに”.”を標準出力する。

 いろいろ試してみてわかったこと。

  • CTRL+CでSIGINTを発生させても、すぐにプロセスは終了しなかった
    (SIGINTを受信するとコンソールに”SIGINT\n”と表示されるが、その後も”.”が何個か表示されていた)
    (追記:どうやら、stdio.hで定義された入出力関数はシグナルに同期しない、つまりシグナル関数内では使用禁止の模様)
  • [タスク マネージャ]の[プロセス]タブから強制終了すると、SIGTERMを受信する前にプロセスが消滅するっぽい?
  • taskkill /fすると、SIGTERMを受信する前にプロセスが消滅するっぽい?

 強制終了がハンドリングできないところを見ると、上記の下二つは9番(SIGKILL)を投げていると考えればいいのでしょうか。

more...

theme : プログラミング
genre : コンピュータ

FC2ブックマーク | この記事をokyuuへインポート | このエントリーを含むはてなブックマーク | ニフティクリップへ追加 | この記事をクリップ! | イザ!ブックマーク | POOKMARK Airlinesに登録する | del.icio.us |
動作未検証 | | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証

[Win23API] メールスロット動作検証サンプル

 メールスロットのサンプル。

 「セッション 0 の分離」対応に使えるかどうかを検証するために使用。

 使い方は、ビルドモジュールのインスタンスを二つ立ち上げる。/sスイッチを付けた方がメールスロットサーバで、/cスイッチを付けた方はクライアントとして動作する。

 /sをつけて実行したメールスロットサーバは、クライアントからの書き込みを待機する。

 /cを付けて実行したクライアントは、"Test."という文字列をポストする。

 メールスロットサーバは、ポストを受信したらポストされた内容(=Test.")をコンソールに表示する。

more...

theme : プログラミング
genre : コンピュータ

FC2ブックマーク | この記事をokyuuへインポート | このエントリーを含むはてなブックマーク | ニフティクリップへ追加 | この記事をクリップ! | イザ!ブックマーク | POOKMARK Airlinesに登録する | del.icio.us |
動作未検証 | | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証

[wINDOWS]メモ

 20009/6/27文の勉強メモ

FC2ブックマーク | この記事をokyuuへインポート | このエントリーを含むはてなブックマーク | ニフティクリップへ追加 | この記事をクリップ! | イザ!ブックマーク | POOKMARK Airlinesに登録する | del.icio.us |
動作未検証 | | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証

[Visual C++ 2008] (const)char*と_TCHAR*

 Visual C++ 2008でちょっとものを作っていたとき、なんとなく引っかかってしまったことがあったのでメモ。

more...

theme : プログラミング
genre : コンピュータ

FC2ブックマーク | この記事をokyuuへインポート | このエントリーを含むはてなブックマーク | ニフティクリップへ追加 | この記事をクリップ! | イザ!ブックマーク | POOKMARK Airlinesに登録する | del.icio.us |
動作未検証 | | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証

[Other] 2009/6/20分の勉強日記

2009/6/21分のメモが、PCとともに飛んでしまった(・ω・`)。

FC2ブックマーク | この記事をokyuuへインポート | このエントリーを含むはてなブックマーク | ニフティクリップへ追加 | この記事をクリップ! | イザ!ブックマーク | POOKMARK Airlinesに登録する | del.icio.us |
動作未検証 | | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証

[Other] 今日の勉強の成果とかメモとかクリップしたネタとか

  1. 今日のクリップ(縮退運転中) - ITドカタのWeb巡回日記
  2. ITドカタ的tumblr - くわぞうメモ ActiveDirectoryにユーザーアカウントを作成する権限を一般ユーザー(グループ)に部分的権限委譲する
  3. 細々とITドカタ的なことをやらせて頂いてます  [Active Directory ユーザーとコンピュータ]コンソールの既定のコンテナ ※復習もかねて。ついでなのでコメントと言うことで補足情報を追記
  4. ITドカタ的tumblr - Windows][W2K3][Active Diractory] コンテナの管理権限を委譲する
  5. ITドカタ的tumblr - [Windows][W2K3][Active Directory]OUの管理権限委譲にはウィザードを使うといい

とりあえず現時点ではこれだけ。PCを閉じたらまた勉強に戻るつもり。

 

FC2ブックマーク | この記事をokyuuへインポート | このエントリーを含むはてなブックマーク | ニフティクリップへ追加 | この記事をクリップ! | イザ!ブックマーク | POOKMARK Airlinesに登録する | del.icio.us |
動作未検証 | | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証

[Other]2009/6/9の日記

FC2ブックマーク | この記事をokyuuへインポート | このエントリーを含むはてなブックマーク | ニフティクリップへ追加 | この記事をクリップ! | イザ!ブックマーク | POOKMARK Airlinesに登録する | del.icio.us |
動作未検証 | | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証

[その他]今日の勉強メモ

FC2ブックマーク | この記事をokyuuへインポート | このエントリーを含むはてなブックマーク | ニフティクリップへ追加 | この記事をクリップ! | イザ!ブックマーク | POOKMARK Airlinesに登録する | del.icio.us |
動作未検証 | | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証
カレンダー
07 | 2019/08 | 09
- - - - 1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
最近の記事
月別アーカイブ
カテゴリー
ブログ内検索
RSSフィード
リンク
いろいろリンクボタン
埋め込みe-Words