アプリ版:「スタンプのみでお礼する」機能のリリースについて

クライアント(Windows)とサーバ(Unix)の通信アプリを作っています。
ソケットプログラムはクライアント側はVBで、サーバ側はCです。
データの送受信はうまくいきました。ところが、データを送信後サーバ側でデータを解析し、その結果を印刷するというしくみなのですがこの全処理が終わらないとクライアント側に送信終了のイベントが発生しません。
クライアント側がデータを送信したら、あとはサーバ側で処理をする、というふうにしたいのです。

そこでサーバ側のアプリは次のような構造になっています。
App1(ソケットアプリ)
exec でApp2 を起動 App2(データの送受信)
wait あり exec でApp3 を起動 App3(データ解析)
             wait なし exec でApp4,App5 を起動
wait あり、sleep あり

App3以降で時間がとてもかかります。wait,sleep が入っているからですが、これはデータ解析する上で必要な手順です。データの送受信はApp2までで終わっているので、App3のプロセスを発行したらソケット切断にしたいのですが、App3が全て終わるまで待ってしまいます。
起動のさせ方でなんとかならないものかと思うのですが、どうぞアドバイスを宜しくお願いいたします。

A 回答 (1件)

全体の構造が詳しく分からないので、ひょっとすると見当違いかも知れませんが、私の経験から幾つかのアドバイスをしましょう。



まず、親プロセスでwaitを使わないときには、子プロセスからの終了シグナルを処理しない、と明言しておかないといけません。子プロセスは終了するときに、親プロセスがシグナルを受け取ったかどうかをチェックしていて、受け取るまでゾンビプロセスになって、残っていきます。もちろん親プロセスが終了してしまうと、このプロセスも消えますが.....。終了シグナルを処理しない、という名言は、Solaris では、sigignore(SIGCHLD) というのがあります。他のUNIX系でも似たようなシステムコールあるいは、シグナルが存在するでしょう。

ただ、上記の問題は直接はクライアント側のロックにはつながらないかも知れません。ただ、以下の理由と組み合わさると、ファイルディスクリプタがゾンビに残り続けるということも起こらないやもしれません。

もう一つ、fork, execをやる場合、ソケットなど、様々なファイルディスクリプタの情報が、子プロセスに受け継がれます。受け継がれたあと、親プロセスでソケットを閉じたとしても、子プロセスに残っているので、クライアントではソケットはつながりっぱなしです。子プロセスから孫プロセスへ受け継いでいけば、どんどんディスクリプタはコピーされるわけで、問題は波及していきます。これを解決するのは単純で、forkのあと、子プロセス側で、必要のないファイルディスクリプタは閉じます。そのあとexecするという処理が必要です。

この回答への補足

今日仕事先でアドバイスしていただいたことを試してみました。
 1.sigignore(SIGCHLD) の記述
 2.子プロセスでソケットディスクリプタを閉じてexitする
サーバ側では、データの受信(子プロセス)のあとデータ解析と印刷は孫プロセスがやっています。データを受信してしまったらソケットを切断してもいいので、子プロセスの終了時にソケットディスクリプタを閉じました。結果は残念ながらこれまでと同じくデータ解析等処理の終了までクライアントに切断のイベントは発生しません。ファイルのopen・closeは各プロセス内でやっているので他に閉じるディスクリプタは見当たりませんし。
申し訳ありませんが、まだほかに思い当たることがありましたらお教えください。
よろしくお願いいたします。

補足日時:2002/03/18 22:35
    • good
    • 0
この回答へのお礼

ありがとうございます。
もともとこのソフトは、クライアント(MS-DOS)とサーバ(UNIX)で作られていたものを、できるだけサーバのソフトをそのまま生かす形でクライアントのソフトだけ作り変えています。サーバ側のソフトは私が作ったものではなく、UNIXシステムプログラミングに不慣れなこともあり、fork・exec・wait・signalのあたりを今勉強しているところです。
「fork, execをやる場合、ソケットなど、様々なファイルディスクリプタの情報が、子プロセスに受け継がれます。受け継がれたあと、親プロセスでソケットを閉じたとしても、子プロセスに残っているので、クライアントではソケットはつながりっぱなしです。」というのはまさにその通りですね。子プロセス・孫プロセスで次々とディスクリプタはコピーされるのですね。ここを見直してみます。
本当に詳しいアドバイスをしていただきありがとうございます。

お礼日時:2002/03/18 11:19

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