ソケット間通信

この内容は以下の書籍を参考にしています。
『Software Design [別冊] Linux ブートキャンプ』(p101)

※ 実際の図は省略

※ ソケットとは具体的にはソケットファイルのことです。

ソケットファイルはどこにあるか

lsof -P -n -i:8000
COMMAND    PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
docker-pr 1382 root    4u  IPv4  30221      0t0  TCP *:8000 (LISTEN)
docker-pr 1388 root    4u  IPv6  30230      0t0  TCP *:8000 (LISTEN)

LISTENしているPIDを調べます。

↑で調べたPIDのFDは/proc/1382/fdディレクトリに格納されています。

ll /proc/1382/fd
total 0
dr-x------ 2 root root  0 Jul 16 16:48 ./
dr-xr-xr-x 9 root root  0 Jul 16 16:48 ../
lr-x------ 1 root root 64 Jul 16 16:48 0 -> /dev/null
l-wx------ 1 root root 64 Jul 16 16:48 1 -> /dev/null
l-wx------ 1 root root 64 Jul 16 16:48 10 -> 'pipe:[30570]'
lr-x------ 1 root root 64 Jul 16 16:48 11 -> 'pipe:[30571]'
l-wx------ 1 root root 64 Jul 16 16:48 12 -> 'pipe:[30571]'
l-wx------ 1 root root 64 Jul 16 16:48 2 -> /dev/null
lrwx------ 1 root root 64 Jul 16 16:48 4 -> 'socket:[30221]'
lrwx------ 1 root root 64 Jul 16 16:48 6 -> 'anon_inode:[eventpoll]'
lr-x------ 1 root root 64 Jul 16 16:48 7 -> 'pipe:[30222]'
l-wx------ 1 root root 64 Jul 16 16:48 8 -> 'pipe:[30222]'
lr-x------ 1 root root 64 Jul 16 16:48 9 -> 'pipe:[30570]'

上記の4 -> 'socket:[30221]'が示すinode番号(30221)を/proc/net/tcp(または/proc/1382/net/tcp)の内容と照合すると、そのソケットが使用しているローカルアドレス・ポートや接続状態を確認できます。つまりソケットの実体そのものがこのファイルというわけではなく、/proc/net/tcpはカーネルが管理するソケット一覧をinode番号で参照できる形で公開しているものです。

ref.

  • https://christina04.hatenablog.com/entry/socket-base
  • https://blog.1q77.com/2020/10/socket-in-proc-pid-fd/?utm_source=pocket_mylist

システムコール

代表的なシステムコールは以下のとおりです。

  • socket
  • bind
  • listen
  • connect
  • accept
  • read
  • write

システムコールは以下を参照してください。
SYSCALLS