connect(2)を呼ぶと、まずsys_connect()が呼ばれる。sys_connect()はsys/kern/uipc_syscalls.cにある。
if ((error = getsock(p->p_fd, SCARG(uap, s), &fp)) != 0)
return (error);
...
so = (struct socket *)fp->f_data;
...
error = soconnect(so, nam, l);
sys_connect()ではgetsock()でsocketを取得。そのsocketをsoconnect()へ渡している。
soconnect()はsys/kern/uipc_socket.cにある。
error = (*so->so_proto->pr_usrreq)(so, PRU_CONNECT,
(struct mbuf *)0, nam, (struct mbuf *)0, l);
で、プロトコル(so_proto)に応じたusrreq関数を呼んでいる。TCPの場合はtcp_usrreq()が呼ばれる。
tcp_usrreq()はsys/netinet/tcp_usrreq.cにあり、
case PRU_CONNECT:
...
error = in_pcbconnect(inp, nam, l);
と、in_pcbconnect()を呼んでいる。
netinet/in_pcb.cのin_pcbconnect()で、
if (sin->sin_port == 0)
return (EADDRNOTAVAIL);
とEADDRNOTAVAILを返している。
本当はgetsock()あたりで、__linkset_add_dataや__linkset_foreachなどおもしろいことが行われているのだが、それはまたいつか書こう。
ところで、uipcとpcbって何の略だろう?
この辺の略語は、どうやって調べたらよいのやら。
6 件のコメント:
uipcはなんとなくUserland Inter Process Callの略かなと想像できますが...
当ってるかどうかも含めて調べ方が謎ですね(w
http://ja.wikipedia.org/wiki/%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E5%88%B6%E5%BE%A1%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF
process control block
だろうけど、
http://ja.wikipedia.org/wiki/%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E9%96%93%E9%80%9A%E4%BF%A1
interprocess communication
の前に付くのは UNIX なのかなあ
コメントありがとうございます。> お二方。
歴史的経緯もありそうですし、正解は書いた本人に聞かないと謎ですねー。
ファイルのコメントにでも、略語の説明を書いてくれていると良いのですが。
ipc は interprocess communication の方でしょう。uはなんだっけ。
sys/sys/proc.h にある pcb は、process control block ですが、
netinet/ の pcb は、protocol control block なので違います。
ちょっと間違えました。
process control block の定義は <sys/proc.h> ではなく <machine/pcb.h> の方ですね。
> sodaさん
ありがとうございます。勉強になりました。
どこかに、略語一覧表があるといいですね。
コメントを投稿