[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