0

私はチャットルームのように機能するTCPサーバーを作成していて、この質問に出くわしました。

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

私の質問は次のとおりです。

Q1:リーパーに追加情報(ユーザーがログインに使用したユーザー名など)を絞り込んで、ユーザーをリーパーから削除する方法を教えてonline.txtください。それとも、そうするための別のより良い方法がありますか?

sigQ2: inはどこreaper()からその価値を得るのですか?刈り取り機にパラメータを追加できますか?

Q3:子のpidをlogin.txtのある種の主キーとして使用できますか?もしそうなら、どうすれば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つの質問をするのはあまり貪欲ではないことを願っています。
質問のいずれかに関する洞察は大歓迎です。

4

2 に答える 2

2

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

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

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

要約すると、次のようになります。

1)いいえ。はい。

2)ハンドラーが受信した信号から。いいえ。

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

于 2010-12-09T15:29:56.340 に答える
1

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

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

質問3:pidの取得はOS固有です。POSIXタイプの場合、通常はunistdからのgetpid()です。ただし、本当にファイルを使用してそれを実行したいのかどうか疑問に思います。

あらゆる場所で信号を送り始めると、ソリューションが競合状態に対して脆弱になる可能性があります...これはセキュリティリスクに役立ちます。

仲間のユーザーの皆さん、お気軽に訂正してください。知恵を求めて、人は指示を受け入れなければなりません。

于 2010-12-09T15:36:47.993 に答える