Manpages

名 前

dup, dup2, dup3 − フ ァ イ ル デ ィ ス ク リ プ タ ー を 複 製 す る

書 式

#include <unistd.h>

int dup(int oldfd);
int dup2(int
oldfd, int newfd);

#define _GNU_SOURCE /* feature_test_macros(7) 参 照 */
#include <fcntl.h>
/* 定 数 O_* の 定 義 の 取 得 */
#include <unistd.h>

int dup3(int oldfd, int newfd, int flags);

説 明

dup() シ ス テ ム コ ー ル は 、 フ ァ イ ル デ ィ ス ク リ プ タ ー oldfd の コ ピ ー を 作 成 し 、 最 も 小 さ い 番 号 の 未 使 用 の デ ィ ス ク リ プ タ ー を 新 し い デ ィ ス ク リ プ タ ー と し て 使 用 す る 。 成 功 が 返 さ れ た 場 合 に は 、 古 い フ ァ イ ル デ ィ ス ク リ プ タ ー と 新 し い フ ァ イ ル デ ィ ス ク リ プ タ ー は 互 い に 可 換 な も の と し て 使 う こ と が で き る 。 2つ の フ ァ イ ル デ ィ ス ク リ プ タ ー は 同 じ フ ァ イ ル 記 述 (description) (open(2) 参 照 ) を 参 照 し て お り 、 し た が っ て フ ァ イ ル オ フ セ ッ ト や フ ァ イ ル 状 態 フ ラ グ が 共 有 さ れ る 。 例 え ば 、 一 方 の デ ィ ス ク リ プ タ ー に 対 し て lseek(2) を 使 っ て フ ァ イ ル オ フ セ ッ ト を 変 更 し た 場 合 、 も う 一 方 の デ ィ ス ク リ プ タ ー の オ フ セ ッ ト も 変 化 す る 。

2つ の デ ィ ス ク リ プ タ ー は フ ァ イ ル デ ィ ス ク リ プ タ ー フ ラ グ (close−on−exec flag) を 共 有 し な い 。 複 製 さ れ た デ ィ ス ク リ プ タ ー の close−on−exec flag (fcntl(2) 参 照 ) は off と な る 。

dup2()
dup2
() シ ス テ ム コ ー ル は dup() と 同 じ 処 理 を 実 行 す る が 、 番 号 が 最 も 小 さ い 未 使 用 の フ ァ イ ル デ ィ ス ク リ プ タ ー を 使 用 す る 代 わ り に 、 newfd で 指 定 さ れ た デ ィ ス ク リ プ タ ー 番 号 を 使 用 す る 。 デ ィ ス ク リ プ タ ー newfd が 以 前 に オ ー プ ン さ れ て い た 場 合 に は 、 黙 っ て そ の デ ィ ス ク リ プ タ ー を ク ロ ー ズ し て か ら 再 利 用 す る 。 フ ァ イ ル デ ィ ス ク リ プ タ ー newfd を ク ロ ー ズ し て 再 利 用 す る 処 理 は ア ト ミ ッ ク (不 可 分 )に 実 行 さ れ る 。 こ れ は 重 要 な 点 で あ る 。 な ぜ な ら 、 等 価 な 機 能 を close(2)dup() を 使 っ て 実 装 し よ う と す る と 、 2 つ の 処 理 の 間 に newfd が 再 利 用 さ れ て し ま う と い う 、 競 合 状 態 に さ ら さ れ る こ と に な る か ら だ 。 こ の よ う な 再 利 用 が 起 こ る の は 、 メ イ ン プ ロ グ ラ ム が フ ァ イ ル デ ィ ス ク リ プ タ ー を 割 り 当 て る シ グ ナ ル ハ ン ド ラ ー に よ り 割 り 込 ま れ た り 、 並 行 動 作 す る ス レ ッ ド が フ ァ イ ル デ ィ ス ク リ プ タ ー を 割 り 当 て た り す る こ と が あ る か ら だ 。 以 下 の 点 に つ い て 注 意 す る こ と :

*

oldfd が 有 効 な フ ァ イ ル デ ィ ス ク リ プ タ ー で な い 場 合 、 そ の 呼 び 出 し は 失 敗 し 、 newfd は ク ロ ー ズ さ れ な い 。

*

oldfd が 有 効 な フ ァ イ ル デ ィ ス ク リ プ タ ー で 、 newfdoldfd と 同 じ 値 の 場 合 、 dup2() は 何 も せ ず 、 newfd を 返 す 。

dup3()
dup3
() は dup2() と 同 じ だ が 、 以 下 の 点 が 異 な る 。

* 呼 び 出 し 元 が 、 新 し い フ ァ イ ル デ ィ ス ク リ プ タ ー に 対 し て

close−on−exec

フ ラ グ を 強 制 的 に 設 定 す る こ と が で き る 。 こ れ を 行 う に は 、 flagsO_CLOEXEC を 指 定 す る 。 こ の フ ラ グ が 役 に 立 つ 理 由 に つ い て は 、 open(2)O_CLOEXEC フ ラ グ の 説 明 を 参 照 の こ と 。

*

oldfdnewfd と 同 じ 場 合 、 dup3() は EINVAL エ ラ ー で 失 敗 す る 。

返 り 値

成 功 す る と 、 こ れ ら の シ ス テ ム コ ー ル は 新 し い デ ィ ス ク リ プ タ ー を 返 す 。 エ ラ ー の 場 合 、 −1 を 返 し 、 errno を 適 切 に 設 定 す る 。

エ ラ ー

EBADF

oldfd が オ ー プ ン さ れ た フ ァ イ ル デ ィ ス ク リ プ タ ー で は な い 。

EBADF

newfd が フ ァ イ ル デ ィ ス ク リ プ タ ー と し て 許 可 さ れ て い る 範 囲 で は な い (getrlimit(2) の RLIMIT_NOFILE の 議 論 を 参 照 )。

EBUSY

(Linux の み ) open(2)dup() と の 競 合 状 態 の 場 合 に 、 dup2() や dup3() は こ の エ ラ ー を 返 す か も し れ な い 。

EINTR

dup2() や dup3() の 呼 び 出 し が シ グ ナ ル に よ り 割 り 込 ま れ た 。 signal(7) 参 照 。

EINVAL

(dup3()) flags に 無 効 な 値 が 入 っ て い る 。

EINVAL

(dup3()) oldfdnewfd と 同 じ で あ っ た 。

EMFILE

プ ロ セ ス が す で に オ ー プ ン で き る 最 大 数 ま で フ ァ イ ル デ ィ ス ク リ プ タ ー を 開 い て い て 、 さ ら に 新 し い も の を 開 こ う と し た (getrlimit(2) の リ ソ ー ス 上 限 RLIMIT_NOFILE を 参 照 )。

バ ー ジ ョ ン

dup3() は バ ー ジ ョ ン 2.6.27 で Linux に 追 加 さ れ た 。 glibc に よ る サ ポ ー ト は バ ー ジ ョ ン 2.9 以 降 で 利 用 で き る 。

準 拠

dup(), dup2(): SVr4, 4.3BSD, POSIX.1−2001.

dup3() は Linux 固 有 で あ る 。

注 意

newfd が 範 囲 を 超 え た 時 に 返 さ れ る エ ラ ー は 、 dup2() と fcntl(..., F_DUPFD, ...) で は 異 っ て い る 。 dup2() が F_DUPFD と 同 じ よ う に EINVAL を 返 す シ ス テ ム も あ る 。

newfd が オ ー プ ン さ れ て い た 場 合 、 close(2) 時 に 報 告 さ れ る こ と に な る エ ラ ー は す べ て 失 わ れ る 。 こ れ が 心 配 で 、 シ ン グ ル ス レ ッ ド か つ シ グ ナ ル ハ ン ド ラ ー で フ ァ イ ル デ ィ ス ク リ プ タ ー を 割 り 当 て る よ う な プ ロ グ ラ ム で な い 場 合 に は 、 正 し い 方 法 は dup2() を 呼 び 出 す 前 に newfd を ク ロ ー ズ 「 し な い 」 こ と で あ る 。 な ぜ な ら 、 上 で 説 明 し た 競 合 状 況 が あ る か ら で あ る 。 代 わ り に 、 以 下 の よ う な コ ー ド が 使 用 で き る こ と だ ろ う 。

/* あ と で close() エ ラ ー を チ ェ ッ ク す る の に 使 用 で き る よ う に
’newfd’ の 複 製 を 取 得 す る 。 EBADF エ ラ ー は
’newfd’ が オ ー プ ン さ れ て い な い こ と を 意 味 す る 。 */

tmpfd = dup(newfd);
if (tmpfd == −1 && errno != EBADF) {
/* 予 期 し な い dup() の エ ラ ー を 処 理 す る */ }

/* ア ト ミ ッ ク に ’oldfd’ を ’newfd’ に 複 製 す る */

if (dup2(oldfd, newfd) == −1) {
/* dup2() の エ ラ ー を 処 理 す る */ }

/* こ こ で も と も と ’newfd’ で 参 照 さ れ て い た フ ァ イ ル の
close() エ ラ ー を チ ェ ッ ク す る */

if (tmpfd != −1) {
if (close(tmpfd) == −1) {
/* close か ら の エ ラ ー を 処 理 す る */ } }

関 連 項 目

close(2), fcntl(2), open(2)

こ の 文 書 に つ い て

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