名 前
unix − ロ ー カ ル な プ ロ セ ス 間 通 信 用 の ソ ケ ッ ト
書 式
#include
<sys/socket.h>
#include <sys/un.h>
unix_socket
= socket(AF_UNIX, type, 0);
error = socketpair(AF_UNIX, type, 0, int
*sv);
説 明
AF_UNIX (AF_LOCAL と も 言 わ れ る ) ソ ケ ッ ト フ ァ ミ リ ー は 、 同 じ マ シ ン 上 で プ ロ セ ス 同 士 が 効 率 的 に 通 信 す る た め に 用 い ら れ る 。 伝 統 的 に 、 UNIX ド メ イ ン ソ ケ ッ ト は 、 名 前 な し に も で き る し 、 (ソ ケ ッ ト 型 で あ る と 印 の つ い た ) フ ァ イ ル シ ス テ ム の パ ス 名 に 結 び 付 け る こ と も で き る 。 さ ら に Linux で は 、 フ ァ イ ル シ ス テ ム に 依 存 し な い 抽 象 名 前 空 間 (abstract namespace) も サ ポ ー ト し て い る 。
UNIX ド メ イ ン に 指 定 で き る ソ ケ ッ ト タ イ プ は 以 下 の 通 り で あ る 。 SOCK_STREAM は 、 ス ト リ ー ム 指 向 の ソ ケ ッ ト で 有 効 で あ る 。 SOCK_DGRAM は 、 メ ッ セ ー ジ 境 界 を 保 存 す る デ ー タ グ ラ ム 指 向 の ソ ケ ッ ト で 有 効 で あ る (ほ と ん ど の UNIX の 実 装 で は 、 UNIX ド メ イ ン デ ー タ グ ラ ム ソ ケ ッ ト は 常 に 信 頼 で き 、 デ ー タ グ ラ ム の 並 び 替 え は 行 わ な い )。 SOCK_SEQPACKET は 、 メ ッ セ ー ジ 境 界 を 保 存 し 送 信 さ れ た 順 序 で メ ッ セ ー ジ を 届 け る 接 続 指 向 ソ ケ ッ ト で 有 効 で あ る (Linux 2.6.4 以 降 で 利 用 で き る )。
UNIX ド
メ イ ン ソ ケ ッ
ト で は 、 補 助
デ ー タ を 使 っ
て フ ァ イ ル デ
ィ ス ク リ プ タ
ー や プ ロ セ ス
の 信 任 状 (credential) を
送 受 信 す る こ
と も で き る 。
ア ド レ ス の フ
ォ ー マ ッ ト
UNIX ド メ イ ン ソ ケ
ッ ト の ア ド レ
ス は 以 下 の 構
造 体 で 表 現 さ
れ る 。
#define UNIX_PATH_MAX 108
struct
sockaddr_un {
sa_family_t sun_family; /* AF_UNIX */
char sun_path[UNIX_PATH_MAX]; /* pathname */ };
sun_family フ ィ ー ル ド に は 必 ず AF_UNIX が 入 っ て い る 。 様 々 な シ ス テ ム コ ー ル (例 え ば bind(2), connect(2), sendto(2)) は 入 力 と し て sockaddr_un 引 き 数 を 取 る 。 他 の い く つ か の シ ス テ ム コ ー ル (例 え ば getsockname(2), getpeername(2), recvfrom(2), accept(2)) は こ の 型 の 引 き 数 を 返 す 。
sockaddr_un 構 造 体 で は 3 種 類 の ア ド レ ス が 区 別 さ れ る 。
* |
pathname (パ ス 名 ): bind(2) を 使 っ て 、 UNIX ド メ イ ン ソ ケ ッ ト を 、 ヌ ル 終 端 さ れ た フ ァ イ ル シ ス テ ム 上 の パ ス 名 に 結 び 付 け る こ と が で き る 。 (上 述 の い ず れ か の シ ス テ ム コ ー ル に よ り ) ソ ケ ッ ト の ア ド レ ス が 返 さ れ る 際 、 そ の 長 さ は |
offsetof(struct sockaddr_un, sun_path) + strlen(sun_path) + 1 で あ り 、 sun_path に は ヌ ル 終 端 さ れ た パ ス 名 が 格 納 さ れ る 。 (Linux で は 、 上 記 の offsetof() 式 は sizeof(sa_family_t) の 値 と 同 じ だ が 、 他 の 実 装 で は sun_path の 前 に 他 の フ ィ ー ル ド が 含 ま れ る 場 合 も あ る 。 そ の た め 、 offsetof() 式 を 使 う 方 が よ り 移 植 性 の あ る 方 法 で ア ド レ ス 構 造 体 の サ イ ズ を 知 る こ と が で き る 。 ) パ ス 名 ソ ケ ッ ト の 詳 細 に つ い て は 、 後 で 説 明 す る 。
* |
unnamed (名 前 な し ): bind(2) を 使 っ て パ ス 名 に 結 び 付 け る こ と が で き な い ス ト リ ー ム 型 の ソ ケ ッ ト は 名 前 を 持 た な い 。 同 様 に 、 socketpair(2) で 作 成 さ れ る 2 つ の ソ ケ ッ ト も 名 前 を 持 た な い 。 名 前 な し の ソ ケ ッ ト の ア ド レ ス を 返 す 際 に は 、 そ の 長 さ は sizeof(sa_family_t) で あ り 、 sun_path は 検 査 す べ き で は な い 。 | ||
* |
abstract (抽 象 ): 抽 象 ソ ケ ッ ト ア ド レ ス は 、 sun_path[0] が ヌ ル バ イ ト ('\0') で あ る こ と か ら (パ ス 名 ソ ケ ッ ト か ら ) 区 別 で き る 。 こ の 名 前 空 間 に お け る ソ ケ ッ ト の ア ド レ ス は 、 sun_path の 残 り の バ イ ト の 、 ア ド レ ス 構 造 体 の 指 定 さ れ た 長 さ の 範 囲 で 表 さ れ る (名 前 中 の ヌ ル バ イ ト に は 特 別 な 意 味 は な い )。 こ の 名 前 は フ ァ イ ル シ ス テ ム の パ ス 名 と は 何 の 関 係 も な い 。 抽 象 ソ ケ ッ ト の ア ド レ ス を 返 さ れ る 際 に は 、 返 さ れ る addrlen は sizeof(sa_family_t) よ り 大 き く (つ ま り 2 よ り 大 き く )、 ソ ケ ッ ト の 名 前 は sun_path の 最 初 の (addrlen − sizeof(sa_family_t)) バ イ ト に 格 納 さ れ る 。 ソ ケ ッ ト の 抽 象 名 前 空 間 は Linux に よ る 拡 張 で あ り 、 移 植 性 は な い 。 |
パ ス 名 ソ ケ ッ ト ソ ケ ッ ト に パ ス 名 を 結 び つ け る 際 に 、 最 大 限 の 移 植 性 を 持 た せ 、 コ ー デ ィ ン グ を 簡 単 に す る た め の ル ー ル が い く つ か あ る 。
* |
sun_path の パ ス 名 は ヌ ル 終 端 す べ き で あ る 。
終 端 の
ヌ ル バ イ ト を
含 め た パ ス 名
の 長 さ は sun_path の
大 き さ を 超 え
な い よ う に す
べ き で あ る 。 sockaddr_un 構 造 体 の 終 わ り を 示 す addrlen 引 き 数 は 最 低 で も 以 下 の 値 を 持 つ べ き で あ る 。 offsetof(struct sockaddr_un, sun_path)+strlen(addr.sun_path)+1 も し く は 、 も っ と 簡 単 に は 、 addrlen に sizeof(struct sockaddr_un) を 指 定 す る こ と も で き る 。 UNIX ド
メ イ ン ソ ケ ッ
ト ア ド レ ス の
扱 い が 上 記 の
ル ー ル に 従 っ
て い な い 実 装
も い く つ か あ
る 。 (全 部 で は
な い が ) い く つ
か の 実 装 で は
、 sun_path に 文 字 列
終 端 の NULL が な か
っ た 場 合 に 終
端 の NULL が 追 加 さ
れ る 。 移 植 性
が あ る ア プ リ
ケ ー シ ョ ン を
作 成 す る 際 に
は 、 い く つ か
の 実 装 で は sun_path
は 92 バ イ ト し か
な い と い う 点
に も 留 意 し て
お く と よ い 。
様 々 な シ ス テ
ム コ ー ル (accept(2),
recvfrom(2), getsockname(2),
getpeername(2)) が ソ ケ ッ
ト ア ド レ ス 構
造 体 を 返 す 。
こ れ ら の シ ス
テ ム コ ー ル が UNIX
ド メ イ ン ソ ケ
ッ ト に 対 し て
呼 ば れ た 際 に
は 、 こ れ ら の
呼 び 出 し に 渡
す addrlen 引 き 数 は
上 記 の 説 明 の
よ う に 初 期 化
す べ き で あ る
。 リ タ ー ン 時
に は 、 こ の 引
き 数 に は ア ド
レ ス 構 造 体 の
「 実 際 の 」 サ
イ ズ が 設 定 さ
れ る 。 呼 び 出
し 側 で は こ の
引 き 数 で 返 さ
れ た 値 を 確 認
す べ き で あ る
。 返 さ れ た 値
が 入 力 値 よ り
も 大 き い 場 合
、 sun_path に 終 端 の
NULL バ イ ト が 存 在
す る 保 証 は な
い (「 バ グ 」 を
参 照 )。 ソ ケ ッ
ト オ プ シ ョ ン
歴 史 的 な 理 由
に よ り 、 こ れ
ら の オ プ シ ョ
ン は た と え AF_UNIX
固 有 の オ プ シ
ョ ン で あ っ て
も SOL_SOCKET 型 で 指
定 す る 。 ソ ケ
ッ ト フ ァ ミ リ
ー と し て SOL_SOCKET
を 指 定 す る と
、 setsockopt(2) で オ プ
シ ョ ン が 設 定
で き 、 getsockopt(2) で
取 得 が で き る
。 UNIX ド メ イ ン ソ ケ ッ ト で は 、 帯 域 外 デ ー タ (out−of−band data) の 送 信 (send(2) と recv(2) の MSG_OOB フ ラ グ ) は サ ポ ー ト さ れ て い な い 。 send(2) MSG_MORE フ ラ グ は UNIX ド メ イ ン ソ ケ ッ ト で は サ ポ ー ト さ れ て い な い 。 recv(2) の flags 引 き 数 で の MSG_TRUNC の 使 用 は UNIX ド メ イ ン ソ ケ ッ ト で は サ ポ ー ト さ れ て い な い 。 SO_SNDBUF
ソ ケ ッ ト オ プ
シ ョ ン は UNIX ド メ
イ ン ソ ケ ッ ト
で 効 果 を 持 つ
が 、 SO_RCVBUF は 効
果 が な い 。 デ
ー タ グ ラ ム ソ
ケ ッ ト で は 、
SO_SNDBUF の 値 が 出
力 デ ー タ グ ラ
ム の 上 限 サ イ
ズ と な る 。 実
際 の 上 限 値 は
、 SO_SNDBUF オ プ シ
ョ ン と し て 設
定 さ れ た 値 の
2倍 (socket(7) 参 照 ) か
ら オ ー バ ヘ ッ
ド と し て 使 用
さ れ る 32 バ イ ト
を 引 い た 値 と
な る 。 補 助 メ
ッ セ ー ジ 補 助
デ ー タ を 送 受
す る に は 、
sendmsg(2) や recvmsg(2) を
使 用 す る 。 歴
史 的 な 理 由 に
よ り 、 以 下 に
示 す 補 助 メ ッ
セ ー ジ の 型 は
た と え AF_UNIX 固 有
の も の で あ っ
て も SOL_SOCKET 型 で
指 定 す る 。 こ
れ ら を 送 る に
は 、 構 造 体 cmsghdr
の cmsg_level フ ィ ー
ル ド に SOL_SOCKET を
セ ッ ト し 、
cmsg_type フ ィ ー ル
ド に タ イ プ を
セ ッ ト す る 。
詳 細 は cmsg(3) を 見
よ 。 UNIX 信 任 状 を 送 受 信 す る 。 こ れ は 認 証 に 用 い る こ と が で き る 。 信 任 状 は struct ucred の 補 助 メ ッ セ ー ジ と し て 渡 さ れ る 。 こ の 構 造 体 は <sys/socket.h> で 以 下 の よ う に 定 義 さ れ て い る 。 struct ucred {
glibc 2.8 以 降 で は 、 こ の 構 造 体 の 定 義 を 得 る た め に は (ど の ヘ ッ ダ ー フ ァ イ ル を イ ン ク ル ー ド す る よ り も 前 に ) 機 能 検 査 マ ク ロ _GNU_SOURCE を 定 義 し な け れ ば な ら な い 。 送 信 側 が 指 定 し た 信 任 状 は 、 カ ー ネ ル が チ ェ ッ ク す る 。 実 効 ユ ー ザ ー ID が 0 の プ ロ セ ス に は 、 自 分 自 身 以 外 の 値 を 指 定 す る 事 が 許 さ れ る 。 送 信 側 は 以 下 の 3 つ を 指 定 し な け れ ば な ら な い 。 1) 自 分 自 身 の プ ロ セ ス ID (CAP_SYS_ADMIN 権 限 を 持 っ て い な い 場 合 )、 2) 自 分 自 身 の ユ ー ザ ー ID あ る い は 実 効 ユ ー ザ ー ID か 保 存 set−user−ID (CAP_SETUID 権 限 を 持 っ て い な い 場 合 )、 3) 自 分 自 身 の グ ル ー プ ID あ る い は 実 行 グ ル ー プ ID か 保 存 set−group−ID (CAP_SETGID を 持 っ て い な い 場 合 )。 struct ucred メ ッ セ ー ジ を 受 信 す る た め に は 、 ソ ケ ッ ト に 対 し SO_PASSCRED オ プ シ ョ ン を 有 効 に し な く て は な ら な い 。 ioctl 以 下 の ioctl(2) 呼 び 出 し は value に 情 報 を 入 れ て 返 す 。 正 し い 書 式 は 以 下 の 通 り 。 int
value; ioctl_type
に は 以 下 を 指
定 で き る : エ ラ ーEADDRINUSE
指 定 し た ロ ー
カ ル ア ド レ ス
が 既 に 使 用 さ
れ て い る か 、
フ ァ イ ル シ ス
テ ム の ソ ケ ッ
ト オ ブ ジ ェ ク
ト が 既 に 存 在
し て い る 。 connect(2) に よ り 指 定 さ れ た リ モ ー ト ア ド レ ス が 接 続 待 ち ソ ケ ッ ト で は な か っ た 。 こ の エ ラ ー は タ ー ゲ ッ ト の パ ス 名 が ソ ケ ッ ト で な か っ た 場 合 に も 発 生 す る 。 ECONNRESET リ モ ー ト ソ ケ ッ ト が 予 期 し な い か た ち で ク ロ ー ズ さ れ た 。
sun_type フ
ィ ー ル ド に AF_UNIX
が 指 定 さ れ て
い な か っ た 、
行 お う と し た
操 作 に 対 し て
ソ ケ ッ ト が 有
効 な 状 態 で は
な か っ た 、 な
ど 。
メ モ リ ー が 足 り な い 。
EOPNOTSUPP ス ト リ ー ム 指 向 で な い ソ ケ ッ ト に 対 し て ス ト リ ー ム 操 作 が 呼 び 出 さ れ た 。 ま た は 帯 域 外 デ ー タ オ プ シ ョ ン を 用 い よ う と し た 。
|