C言語システムコール-dup

dupシステムコール

概要

dupはファイルディスクリプタを複製します。

dupは「duplicate=複製」の略です。


dupは引数で指定したファイルディスクリプタを複製して、未使用のファイルディスクリプタから最小番号を割り当てます。

複製される新規ファイルディスクリプタを直接する場合にはdup2システムコールを利用します。

dup2はdupを改良したシステムコールです。


なお、ファイルディスクリプタの複製はfcntl(F_DUPFD)を利用する方法もあります。


サンプルプログラム


#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

/*!
 * @brief     標準出力をファイルに複製する
 * @param[in] filepath  ファイルパス名
 * @return    0:success/-1:failure
 */
static int
stdout_to_file(char *filepath)
{
    int rc = 0;
    int fd = 0;

    fd = open(filepath, O_WRONLY|O_CREAT|O_TRUNC, 0666);
    if(fd < 0){
        printf("Error: open() %s: %s\n", strerror(errno), filepath);
        return(-1);
    }

    /* 標準出力をファイルにする。 */
    close(1);
    rc = dup(fd);
    if(rc < 0){
        printf("Error: dup() %s: %d\n", strerror(errno), fd);
        return(-1);
    }
    close(fd);

    /* ファイルに出力する */
    printf("message\n");

    return(0);
}

int
main(int argc, char *argv[])
{
    int rc = 0;

    if(argc != 2){
        fprintf(stderr, "Usage: %s <path>\n", argv[0]);
        exit(EXIT_FAILURE);
    }

    rc = stdout_to_file(argv[1]);
    if(rc != 0) exit(EXIT_FAILURE);

    exit(EXIT_SUCCESS);
}


関連ページ