dup() — オープン・ファイル記述子の複写

標準

標準/拡張機能 C/C++ 依存項目

POSIX.1
XPG4
XPG4.2
Single UNIX Specification、バージョン 3

両方  

形式

#define _POSIX_SOURCE
#include <unistd.h>

int dup(int fildes);

機能説明

使用できる最も小さい番号の記述子である 新規ファイル記述子を戻します。新規ファイル記述子は、fildes と同じ オープン・ファイルを参照して、fildes と関連して いる可能性のある任意のロックを共用します。

以下の命令は等価です。
fd = dup(fildes);
fd = fcntl(fildes,F_DUPFD,0);
詳しくは、fcntl() - オープン・ファイル記述子の制御を参照してください。
注: fildes が XTI エンドポイントの場合、最も小さい番号の使用 可能なファイル記述子は 65535 を超えてはなりません。

戻り値

正常に実行された場合、dup() は、新規ファイル記述子を戻します。

正常に実行されなかった場合、dup() は -1 を戻して、errno を次のいずれかの値に設定します。
エラー・コード
説明
EBADF
fildes が、有効なオープン・ファイル記述子ではありません。
EMFILE
プロセスは、オープン・ファイル記述子の最大数に 既に達しています。

CELEBD05
⁄* CELEBD05

   This example duplicates an open file descriptor, using dup().

 *⁄
#define _POSIX_SOURCE
#include <errno.h>
#include <sys⁄stat.h>
#include <sys⁄types.h>
#include <unistd.h>
#undef _POSIX_SOURCE
#include <stdio.h>

void print_inode(int fd) {
 struct stat info;
 if (fstat(fd, &info) != 0)
   fprintf(stderr,"fstat() error for fd %d: %s¥n",fd,strerror(errno));
 else
   printf("The inode of fd %d is %d¥n", fd, (int) info.st_ino);
}

main() {
  int fd;
  if ((fd = dup(0)) < 0)
    perror("&dupf error");
  else {
    print_inode(0);
    print_inode(fd);
    puts("The file descriptors are different but");
    puts("they point to the same file.");
    close(fd);
  }
}
出力:
The inode of fd 0 is 30
The inode of fd 3 is 30
The file descriptors are different but
they point to the same file.

関連情報