2010-12-09 9 views
0

私はチャットルームのように機能し、この質問に遭遇したTCPサーバーを作成しています。親が子を殺すように通知されたときに、リーパー関数に追加のパラメータをどのようにして絞り込むか(c)?

ユーザーが接続すると、ユーザーにサービスするための子プロセスが作成されます。
ユーザーがログインすると、私は、テキストファイルにonline.txt
を自分のユーザー名を保存する。しかし、ユーザーがログアウトすると、私はonline.txt(PROBLEM)からユーザーを削除する必要があり、親をそしてsignalsreaper()をして子供を殺します。

私の質問は以下のとおりです。

Q1:私は死神に追加情報に絞ることができますどのように、それはまたonline.txtからユーザーを削除することができるように(例えば、ユーザがログインするために使用したユーザー名など)?それとももっと良い方法がありますか?

Q2:sigreaper()は?から値を取得しますか? Reaperにパラメータを追加できますか?

Q3:login.txtのプライマリキーとして子供のpidを使用できますか?もしそうなら、どうすれば親から呼び出されるreaper()の間に子供のpidを取得できますか?

刈り取りは、次のようになります。

void reaper(int sig)//where does sig come from? 
{ 
int status; 

while (waitpid(-1, &status, WNOHANG) >= 0) 
    ; 
} 

親によって使用される信号は次のようになります。

(void) signal(SIGCHLD, reaper);//how can I add more parameters? 

は、私は一度に3つの質問をすることはあまりないことを願う、事前にありがとう貪欲。
質問のANYについての洞察は非常に高く評価されます。

+1

親は刈り取り器で子供を殺すように指示されています...時には、このような質問を入力している間に、邪魔をしていないと気づいていない傍観者が、そして、あなたに何が起こり、警察に電話するときにこれをどう説明するのですか? – Secure

+0

私はすぐにこのフォーラムから禁止されると思います。 –

答えて

2

質問から収集できる限り、親プロセスはSIGCHLDのハンドラとしてreaper()を登録します。ログインを検出すると、ユーザー名をファイルに書き込み、子を生成します。

ログオフ時に、子プロセスがログオフを検出して終了したため、reaper()関数が呼び出されました。

もしそうなら、サーバーにユーザー名にPIDをマッピングするデータ構造を維持させるだけではいかがでしょうか。次に、waitpidから戻り値を取得し、ファイルから削除する必要のあるユーザー名を特定します。

1)号はい:要約するよう

、。

2)ハンドラが受信した信号から。 No.

3)はい。 waitpid()の戻り値から。

+0

あなたの洞察に感謝します! waitpid()のドキュメントは非常に長く、戻り値セクションまで読み終わっていませんでした。 私はマルチプロセスを使用しています。なぜなら、それは並行サーバーだからです。ログオフアクションは、別の端末によって実行されます。 –

+1

実際には、関数の宣言から、戻り値の型がpid_tであることがわかります。たとえそれが並行サーバーであっても、マルチスレッド(yeuch)を使用するか、さらにはシングルスレッドを使用して行うことができます。私は自分でシングルスレッドを好む。私は会社がシングルスレッドのWebサーバーを作ったことは知っていましたが、基本的には独自のマルチスレッドコードを使用して不正を行っていました。とにかく、マルチプロセスも良いことができますが、soemの利点を持っているすべてのものをシングルスレッド化することは可能です。チャットルームをどのように機能させるかによって決まります。 – AlastairG

1

質問1:子プロセスのシグナルハンドラを設定して、特定のアクションを実行するのが適切なのでしょうか?しかし、もっと良い解決策は、ユーザがログインしているものを格納するためのメモリ構造ではなく、ファイルを使用しないことです。この方法では、メモリからのエントリや提案されたシグナルハンドラを削除することができます。

質問2:私はお使いのOSやアーキテクチャに精通していませんが、SIGCHLDがパラメータ値としてreaper(int sig)に渡されると思います。

質問3:pidの取得は特定のものです。 POSIX型の場合、通常はunistd ..からのgetpid()ですが、実際にファイルでそれをしたいのかどうか疑問です。

解決策は、あなたがどこにでも信号を送り始めると競合状態に脆弱になる可能性があります。これはセキュリティ上のリスクに役立ちます。

私を訂正してください。知恵の探求では、指示を受けなければなりません。

+0

あなたの洞察力をどうもありがとう!特にQ1!私はその話題についてさらに研究をするつもりです! –

+1

私は彼が死んだ子供のPIDを望んでいると思うので、waitpid()はgetpid()でなく、現在のプロセスのPIDを返すだけです。 fork()は最初に子のPIDを返します。 1つのプロセス(親プロセス)だけがファイルを管理している場合、どのように競合状態になるかわかりません。データをメモリに保存するのが最善です - ファイルを使用する特定の理由があると思いました。 – AlastairG

関連する問題