Manpages

名 前

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 の 残 り の バ イ ト の 、 ア ド レ ス 構 造 体 の 指 定 さ れ た 長 さ の 範 囲 で 表 さ れ る (名 前 中 の ヌ ル バ イ ト に は 特 別 な 意 味 は な い )。 こ の 名 前 は フ ァ イ ル シ ス テ ム の パ ス 名 と は 何 の 関 係 も な い 。 抽 象 ソ ケ ッ ト の ア ド レ ス を 返 さ れ る 際 に は 、 返 さ れ る addrlensizeof(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 も し く は 、 も っ と 簡 単 に は 、 addrlensizeof(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) で 取 得 が で き る 。
SO_PASSCRED
送 信 プ ロ セ ス の 補 助 メ ッ セ ー ジ で 信 任 状 を 受 信 で き る よ う に す る 。 こ の オ プ シ ョ ン が セ ッ ト さ れ て い て 、 ま だ ソ ケ ッ ト が 接 続 さ れ て い な い と 、 抽 象 名 前 空 間 に 他 と 重 な ら な い 名 前 が 自 動 的 に 生 成 さ れ る 。 ブ ー ル 整 数 値 の フ ラ グ を 取 る 。 自 動 バ イ ン ド (autobind) 機 能
bind(2) 呼 び 出 し で sizeof(sa_family_t) と し て addrlen を 指 定 す る か 、 ア ド レ ス に 明 示 的 に バ イ ン ド さ れ て い な い ソ ケ ッ ト に 対 し て SO_PASSCRED ソ ケ ッ ト オ プ シ ョ ン が 指 定 さ れ て い た 場 合 、 そ の ソ ケ ッ ト は 抽 象 ア ド レ ス に 自 動 的 に バ イ ン ド さ れ る 。 こ の ア ド レ ス は 、 1 個 の ヌ ル バ イ ト の 後 に 、 文 字 集 合 [0−9a−f] の バ イ ト が 5 個 続 く 形 式 で あ る 。 し た が っ て 、 自 動 的 に バ イ ン ド さ れ る ア ド レ ス 数 に は 2^20 個 と い う 上 限 が 存 在 す る 。 (Linux 2.1.15 以 降 で 、 自 動 バ イ ン ド 機 能 が 追 加 さ れ た と き に は 、 8 バ イ ト が 使 わ れ て お り 、 自 動 バ イ ン ド ア ド レ ス 数 の 上 限 は 2^32 で あ っ た 。 Linux 2.3.15 で 5 バ イ ト に 変 更 さ れ た 。 ) ソ ケ ッ ト API こ の 節 で は 、 Linux の UNIX ド メ イ ン ソ ケ ッ ト で の 、 ド メ イ ン 固 有 の 詳 細 仕 様 と ソ ケ ッ ト API で サ ポ ー ト さ れ て い な い 機 能 に つ い て 説 明 す る 。

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 型 で 指 定 す る 。 こ れ ら を 送 る に は 、 構 造 体 cmsghdrcmsg_level フ ィ ー ル ド に SOL_SOCKET を セ ッ ト し 、 cmsg_type フ ィ ー ル ド に タ イ プ を セ ッ ト す る 。 詳 細 は cmsg(3) を 見 よ 。
SCM_RIGHTS
他 の プ ロ セ ス で オ ー プ ン さ れ た フ ァ イ ル デ ィ ス ク リ プ タ ー の セ ッ ト を 送 受 信 す る 。 デ ー タ 部 分 に フ ァ イ ル デ ィ ス ク リ プ タ ー の 整 数 配 列 が 入 っ て い る 。 渡 さ れ た フ ァ イ ル デ ィ ス ク リ プ タ ー は 、 あ た か も dup(2) で 生 成 さ れ た か の よ う に 振 る 舞 う 。
SCM_CREDENTIALS

UNIX 信 任 状 を 送 受 信 す る 。 こ れ は 認 証 に 用 い る こ と が で き る 。 信 任 状 は struct ucred の 補 助 メ ッ セ ー ジ と し て 渡 さ れ る 。 こ の 構 造 体 は <sys/socket.h> で 以 下 の よ う に 定 義 さ れ て い る 。

struct ucred {
pid_t pid; /* process ID of the sending process */
uid_t uid; /* user ID of the sending process */
gid_t gid; /* group ID of the sending process */ };

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;
error
= ioctl(unix_socket, ioctl_type, &value);

ioctl_type に は 以 下 を 指 定 で き る :
SIOCINQ
受 信 バ ッ フ ァ ー の キ ュ ー に あ る 、 ま だ 読 ん で い な い デ ー タ の 量 を 返 す 。 ソ ケ ッ ト は LISTEN 状 態 に あ っ て は な ら ず 、 さ も な い と エ ラ ー (EINVAL) が 返 る 。 SIOCINQ<linux/sockios.h> で 定 義 さ れ て い る 。 代 わ り に 、 <sys/ioctl.h> で 定 義 さ れ て い る 、 同 義 語 の FIONREAD を 使 う こ と も で き る 。

エ ラ ー

EADDRINUSE 指 定 し た ロ ー カ ル ア ド レ ス が 既 に 使 用 さ れ て い る か 、 フ ァ イ ル シ ス テ ム の ソ ケ ッ ト オ ブ ジ ェ ク ト が 既 に 存 在 し て い る 。
ECONNREFUSED

connect(2) に よ り 指 定 さ れ た リ モ ー ト ア ド レ ス が 接 続 待 ち ソ ケ ッ ト で は な か っ た 。 こ の エ ラ ー は タ ー ゲ ッ ト の パ ス 名 が ソ ケ ッ ト で な か っ た 場 合 に も 発 生 す る 。

ECONNRESET リ モ ー ト ソ ケ ッ ト が 予 期 し な い か た ち で ク ロ ー ズ さ れ た 。

EFAULT ユ ー ザ ー メ モ リ ー ア ド レ ス が 不 正 。

EINVAL 渡 し た 引 数 が 不 正 。 よ く あ る 原 因 と し て は 、 渡 し た ア ド レ ス の

sun_type フ ィ ー ル ド に AF_UNIX が 指 定 さ れ て い な か っ た 、 行 お う と し た 操 作 に 対 し て ソ ケ ッ ト が 有 効 な 状 態 で は な か っ た 、 な ど 。
EISCONN
既 に 接 続 さ れ て い る ソ ケ ッ ト に 対 し て connect(2) が 呼 ば れ た 。 ま た は 、 指 定 し た タ ー ゲ ッ ト ア ド レ ス が 既 に 接 続 済 み の ソ ケ ッ ト だ っ た 。

ENOENT

connect(2) に 指 定 さ れ た リ モ ー ト ア ド レ ス の パ ス 名 が 存 在 し な か っ た 。

ENOMEM

メ モ リ ー が 足 り な い 。

ENOTCONN ソ ケ ッ ト 操 作 に タ ー ゲ ッ ト ア ド レ ス が 必 要 だ が 、 こ の ソ ケ ッ ト は 接 続 さ れ て い な い 。

EOPNOTSUPP ス ト リ ー ム 指 向 で な い ソ ケ ッ ト に 対 し て ス ト リ ー ム 操 作 が 呼 び 出 さ れ た 。 ま た は 帯 域 外 デ ー タ オ プ シ ョ ン を 用 い よ う と し た 。

EPERM 送 信 者 が

struct ucred に 不 正 な 信 任 状 を 渡 し た 。

EPIPE リ モ ー ト ソ

ケ ッ ト が ス ト リ ー ム ソ ケ ッ ト 上 で ク ロ ー ズ さ れ た 。 可 能 な 場 合 は SIGPIPE も 同 時 に 送 ら れ る 。 こ れ を 避 け る に は MSG_NOSIGNAL フ ラ グ を sendmsg(2)recvmsg(2) に 渡 す 。

EPROTONOSUPPORT 渡 さ れ た プ ロ ト コ ル が AF_UNIX で な い 。
EPROTOTYPE
リ モ ー ト ソ ケ ッ ト と ロ ー カ ル ソ ケ ッ ト の タ イ プ が 一 致 し て い な か っ た (SOCK_DGRAMSOCK_STREAM)。
ESOCKTNOSUPPORT
未 知 の ソ ケ ッ ト タ イ プ 。 他 に も 汎 用 の ソ ケ ッ ト 層 で エ ラ ー が 起 こ っ た り 、 フ ァ イ ル シ ス テ ム 上 に ソ ケ ッ ト オ ブ ジ ェ ク ト を 作 ろ う と し た 場 合 に フ ァ イ ル シ ス テ ム の エ ラ ー が 起 こ る こ と が あ る 。 そ れ ぞ れ の 詳 細 は 適 切 な man ペ ー ジ を 参 照 す る こ と 。

バ ー ジ ョ ン

SCM_CREDENTIALS と 抽 象 名 前 空 間 は 、 Linux 2.2 で 導 入 さ れ た 。 移 植 性 が 必 要 な プ ロ グ ラ ム で は 使 う べ き で は な い 。 (BSD 由 来 の シ ス テ ム の 中 に も 信 任 状 の 送 受 信 を サ ポ ー ト し て い る も の が あ る が 、 そ の 実 装 の 詳 細 は シ ス テ ム に よ っ て 異 な る )

注 意

Linux の 実 装 で は 、 フ ァ イ ル シ ス テ ム 上 か ら 見 え る ソ ケ ッ ト は 、 そ れ ら が 置 か れ て い る デ ィ レ ク ト リ の パ ー ミ ッ シ ョ ン に 従 う 。 ソ ケ ッ ト の 所 有 者 、 グ ル ー プ 、 パ ー ミ ッ シ ョ ン は 変 更 で き る 。 新 し い ソ ケ ッ ト を 作 る と き 、 作 ろ う と す る デ ィ レ ク ト リ に 対 し て プ ロ セ ス が 書 き 込 み と 検 索 (実 行 ) 権 限 を 持 っ て い な け れ ば 、 作 成 に 失 敗 す る 。 ソ ケ ッ ト オ ブ ジ ェ ク ト に 接 続 す る に は 、 read/write 権 限 が 必 要 で あ る 。 こ の 動 作 は 、 多 く の BSD 由 来 の シ ス テ ム と は 異 な っ て い る (BSD で は UNIX ド メ イ ン ソ ケ ッ ト に 対 し て は パ ー ミ ッ シ ョ ン を 無 視 す る )。 移 植 性 の 必 要 な プ ロ グ ラ ム で は 、 セ キ ュ リ テ ィ を こ の 仕 様 に 依 存 し て は な ら な い 。 フ ァ イ ル 名 を 指 定 し て ソ ケ ッ ト に バ イ ン ド す る と 、 フ ァ イ ル シ ス テ ム に ソ ケ ッ ト が 生 成 さ れ る 。 こ れ は 必 要 な く な っ た と き に 呼 び だ し た ユ ー ザ ー が 削 除 し な け れ ば な ら な い (unlink(2) を 用 い る )。 UNIX で 通 常 使 わ れ る 「 背 後 で 閉 じ る 方 式 」 が 適 用 さ れ る 。 ソ ケ ッ ト は い つ で も unlink す る こ と が で き 、 最 後 の 参 照 が ク ロ ー ズ さ れ た と き に フ ァ イ ル シ ス テ ム か ら 削 除 さ れ る 。

SOCK_STREAM 上 で フ ァ イ ル デ ィ ス ク リ プ タ ー や 信 任 状 を 渡 す た め に は 、 同 じ sendmsg(2)recvmsg(2) コ ー ル で 補 助 デ ー タ 以 外 の デ ー タ を 少 な く と も 1 バ イ ト 送 信 /受 信 す る 必 要 が あ る 。

UNIX ド メ イ ン の ス ト リ ー ム ソ ケ ッ ト で は 、 帯 域 外 デ ー タ の 概 念 は サ ポ ー ト さ れ な い 。

バ グ

ソ ケ ッ ト を ア ド レ ス に 結 び つ け る 際 、 Linux は 終 端 の NULL が sun_path に な か っ た 場 合 に 追 加 す る 実 装 の 一 つ で あ る 。 ほ と ん ど の 場 合 、 こ れ は 問 題 に な ら な い 。 ソ ケ ッ ト ア ド レ ス が 取 得 さ れ た 際 、 ソ ケ ッ ト を バ イ ン ド し た と き に 指 定 し た も の よ り 1 バ イ ト 長 く な る だ け で あ る 。 し か し な が ら 、 紛 ら わ し い 動 作 が 起 こ る 場 合 が 一 つ あ る 。 ソ ケ ッ ト を バ イ ン ド し た 際 に 108 個 の NULL で な い バ イ ト を 指 定 し た 場 合 、 終 端 の NULL が 追 加 さ れ る と パ ス 名 の 長 さ が sizeof(sun_path) を 超 え て し ま う 。 結 果 と し て 、 (例 え ば accept(2) で ) ソ ケ ッ ト ア ド レ ス を 取 得 し た 際 に 、 値 を 取 得 す る 呼 び 出 し の 入 力 の address 引 き 数 に sizeof(struct sockaddr_un) を 指 定 し た と す る と 、 返 さ れ る ア ド レ ス 構 造 体 は sun_path に 終 端 の NULL を 「 含 ま な い 」 こ と に な る 。 さ ら に 、 い く つ か の 実 装 で は 、 ソ ケ ッ ト を バ イ ン ド す る 際 に 終 端 の NULL が 必 要 で は な く (addrlen 引 き 数 を 使 っ て sun_path の 長 さ が 判 定 さ れ る )、 こ の よ う な 実 装 で ソ ケ ッ ト ア ド レ ス を 取 得 す る 際 に は 、 sun_path に 終 端 の NULL は 存 在 し な い 。 ソ ケ ッ ト ア ド レ ス を 取 得 す る ア プ リ ケ ー シ ョ ン で は 、 sun_path に 終 端 の NULL が 存 在 し な い と い う 移 植 性 の 問 題 を 、 パ ス 名 の 有 効 な バ イ ト 数 が 以 下 の よ う に な る と 事 実 を 考 慮 す る こ と で 取 り 扱 う こ と が で き る 。

strnlen(addr.sun_path, addrlen − offsetof(sockaddr_un, sun_path)) 他 の 方 法 と し て は 、 ア プ リ ケ ー シ ョ ン が ソ ケ ッ ト ア ド レ ス を 取 得 す る 際 、 取 得 の 呼 び 出 し を 行 う 前 に 、 大 き さ が sizeof(struct sockaddr_un)+1 の バ ッ フ ァ ー を 割 り 当 て る こ と も で き る 。 取 得 の 呼 び 出 し で は addrlensizeof(struct sockaddr_un) を 指 定 す る と 、 余 分 な 一 つ の 0 バ イ ト に よ り sun_path で 返 さ れ る 文 字 列 に 終 端 の NULL が 含 ま れ る こ と が 保 証 さ れ る 。

void *addrp;

addrlen = sizeof(struct sockaddr_un);
addrp = malloc(addrlen + 1);
if (addrp == NULL)
/* Handle error */ ;
memset(addrp, 0, addrlen + 1);

if (getsockname(sfd, (struct sockaddr *) addrp, &addrlen)) == −1)
/* handle error */ ;

printf("sun_path = %s\n", ((struct sockaddr_un *) addrp)−>sun_path); ア プ リ ケ ー シ ョ ン が 「 パ ス 名 ソ ケ ッ ト 」 の 節 で 説 明 し た ル ー ル に し た が っ て パ ス 名 を 「 作 成 」 し て い れ ば 、 こ の よ う な 分 か り に く さ は 避 け る こ と が で き る 。

bind(2) 参 照 。

SCM_RIGHTS の 使 用 例 に つ い て は cmsg(3) を 参 照 。

関 連 項 目

recvmsg(2), sendmsg(2), socket(2), socketpair(2), cmsg(3), capabilities(7), credentials(7), socket(7)

こ の 文 書 に つ い て

こ の man ペ ー ジ は Linux man−pages プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。