[kansaipm] Socketについて教えてください
Tetsuya Ryuchi
ryuchi at ryuchi.org
Mon Dec 24 22:01:44 CST 2001
りゅうちです
> > > ソケットとセレクトを使ったapacheで動く、cgiプログラムを作っています。
> > > 1週間ほど悩んでいます。何かヒントでもありましたら、よろしく。
> >
> > うーん、下記のサンプルだと Apache用のCGIでもなければ、モジュールでも
> > ない気がします。スタンドアローンのサーバでないですか?
>
> きっと、Perlで書かれたCGIプログラムがクライアントとして、
> スタンドアロンのサーバへconnect しに行くという図式なのでしょう。
なるほど... ということは ユーザは webブラウザを使ってアクセスするのね、
> > # ところで select(2) って必要でしたっけ? (^^;
>
> きっと、fork せずに、1個のプロセスで複数のソケットを管理して、
> とっかえひっかえ使おうとしているのでしょう。
> それなら必要ですよね、select(2)。
そうか... 確かに必要なんですね、私は いつも fork(2) して通信は子供にやら
せるようなコーティングしていたし、子供はほとんど何も考えずにソケットから読
んでいました。あ、ソケットにデータがあるかの判定には select(2) を使ったり
しましたが、接続待ちとかには使いませんでした...
> > > ID (4とか 5とか連番)が付けられています。クライアント側は、どうすれ
> > > ば、
> > > 自分のデータだけを受け取れるのでしょうか。クライアントも、IPアドレスと
> > > ポートではないのでしょうか。
> >
> > ?? ID ってなんでしょう? ソケットでは そういう番号は使わない気がしますが
>
> きっと、accept() が返すファイルディスクリプタの番号のことでしょう。
> ファイルディスクリプタの番号は、0:stdin, 1:stdout, 2:stderr に続いて
> 3番以降が振られますよね、たぶんソケットでも。
なるほど... ソケットでも番号が割り当てられるので その番号ですね、きっと。
何番になるか気にせず、割り当てられた番号を考えずに使っていたから... (^^;
> > > selectを使わず、 forkを使おうとしたら、 waitpidで子プロセスを殺さず、次
> > > の
> > > クライアントからの要求のため、acceptの待ちに入っていいのでしょうか。
> >
> > fork(2) を使って あるクライアントからの接続を子に任せて、親は次から次へ
> > と来る要求を処理するために accept(2)すればいいです。
> > 子が終わるときは 親にシグナルを送って、親がシグナルを受けたら wait して
> > やればいいはずです。
>
> えっと、子プロセスが終わると、SIGCHLDのシグナルは自動的に発生するん
> でしたっけ。親のほうで、シグナルハンドラを用意すれば良いんですよね。
子供が exit(3) すると... うーん ごめんなさい、詳細は忘れた... (^^;
# ちょっと man を引いてみたけど...
> サンプルが無いかと google で、「waitpid reaper sample」とか検索して
> みると ... んー、なぜか Perl のサンプルばかり。
> C言語のサンプルは、出て来ませんねえ。
> でも、基本的なやり方は参考になるかも。
use Socket; した環境では基本は同じです。さらに抽象化するようなモジ
ュールを組み込んでしまえば 参考にしにくいかも...
(龍)
--
# From Tetsuya Ryuchi <ryuchi@[ryuchi|fmclub|bsdclub|inet6].org>
# Powered By FreeBSD, IPv4 and IPv6 Ready!
More information about the Kansai-pm
mailing list