copy_file_range(2) - wariua/manpages-ko GitHub Wiki

NAME

copy_file_range - ํ•œ ํŒŒ์ผ์—์„œ ๋‹ค๋ฅธ ํŒŒ์ผ๋กœ ๋ฐ์ดํ„ฐ ๊ตฌ๊ฐ„ ๋ณต์‚ฌํ•˜๊ธฐ

SYNOPSIS

#include _GNU_SOURCE
#include <unistd.h>

ssize_t copy_file_range(int fd_in, loff_t *off_in,
                        int fd_out, loff_t *off_out,
                        size_t len, unsigned int flags);

DESCRIPTION

copy_file_range() ์‹œ์Šคํ…œ ํ˜ธ์ถœ์€ ์ปค๋„์—์„œ ์‚ฌ์šฉ์ž ๊ณต๊ฐ„์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด๊ณ  ๋ฐ›๋Š” ์ถ”๊ฐ€ ๋น„์šฉ ์—†์ด ์ปค๋„ ๋‚ด์—์„œ ๋‘ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ ๊ฐ„์— ๋ณต์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค. ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ fd_in์—์„œ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ fd_out์œผ๋กœ ์ตœ๋Œ€ len ๋ฐ”์ดํŠธ๊นŒ์ง€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต์‚ฌํ•˜๋ฉฐ, ๋Œ€์ƒ ํŒŒ์ผ์—์„œ ์š”์ฒญ ๋ฒ”์œ„ ๋‚ด์— ๋ฐ์ดํ„ฐ๊ฐ€ ์กด์žฌํ•˜๋ฉด ๋ฎ์–ด ์“ด๋‹ค.

off_in์— ๋‹ค์Œ ์˜๋ฏธ๋ก ์ด ์ ์šฉ๋˜๋ฉฐ, ๋น„์Šทํ•œ ๋‚ด์šฉ์ด off_out์—๋„ ์ ์šฉ๋œ๋‹ค.

  • off_in์ด NULL์ด๋ฉด ํŒŒ์ผ ์˜คํ”„์…‹๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์„œ fd_in์—์„œ ๋ฐ”์ดํŠธ๋ฅผ ์ฝ์–ด ๋“ค์ด๋ฉฐ, ๋ณต์‚ฌํ•œ ๋ฐ”์ดํŠธ ์ˆ˜๋งŒํผ ํŒŒ์ผ ์˜คํ”„์…‹์„ ์กฐ์ •ํ•œ๋‹ค.

  • off_in์ด NULL์ด ์•„๋‹ˆ๋ฉด off_in์€ fd_in์—์„œ ๋ฐ”์ดํŠธ๋ฅผ ์ฝ์–ด ๋“ค์ด๊ธฐ ์‹œ์ž‘ํ•  ์˜คํ”„์…‹์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฒ„ํผ๋ฅผ ๊ฐ€๋ฆฌ์ผœ์•ผ ํ•œ๋‹ค. fd_in์˜ ํŒŒ์ผ ์˜คํ”„์…‹์„ ๋ฐ”๊พธ์ง€ ์•Š์œผ๋ฉฐ, ๋Œ€์‹  off_in์„ ์ ์ ˆํžˆ ์กฐ์ •ํ•œ๋‹ค.

flags ์ธ์ž๋Š” ํ–ฅํ›„ ํ™•์žฅ์„ ์œ„ํ•œ ๊ฒƒ์ด๋ฉฐ ํ˜„์žฌ๋Š” 0์ด์–ด์•ผ ํ•œ๋‹ค.

RETURN VALUE

์„ฑ๊ณต ์™„๋ฃŒ ์‹œ copy_file_range()๋Š” ํŒŒ์ผ๋“ค ์‚ฌ์ด์—์„œ ๋ณต์‚ฌํ•œ ๋ฐ”์ดํŠธ ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์›๋ž˜ ์š”์ฒญํ•œ ๊ธธ์ด๋ณด๋‹ค ์ ์„ ์ˆ˜๋„ ์žˆ๋‹ค.

์˜ค๋ฅ˜ ์‹œ copy_file_range()๋Š” -1์„ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ ์˜ค๋ฅ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋„๋ก errno๋ฅผ ์„ค์ •ํ•œ๋‹ค.

ERRORS

EBADF
ํ•œ ๊ฐœ ์ด์ƒ์˜ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๊ฐ€ ์œ ํšจํ•˜์ง€ ์•Š๋‹ค. ๋˜๋Š” fd_in์ด ์ฝ๊ธฐ ๊ฐ€๋Šฅํ•˜๊ฒŒ ์—ด๋ ค ์žˆ์ง€ ์•Š๋‹ค. ๋˜๋Š” fd_out์ด ์“ฐ๊ธฐ ๊ฐ€๋Šฅํ•˜๊ฒŒ ์—ด๋ ค ์žˆ์ง€ ์•Š๋‹ค. ๋˜๋Š” fd_out์ด ๊ฐ€๋ฆฌํ‚ค๋Š” ์—ด๋ฆฐ ํŒŒ์ผ ๊ธฐ์ˆ  ํ•ญ๋ชฉ(open(2) ์ฐธ๊ณ )์— O_APPEND ํ”Œ๋ž˜๊ทธ๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ๋‹ค.
EFBIG
๊ตฌํ˜„์—์„œ ์ •์˜ํ•˜๋Š” ํŒŒ์ผ ์ตœ๋Œ€ ํฌ๊ธฐ๋‚˜ ํ”„๋กœ์„ธ์Šค์˜ ํŒŒ์ผ ํฌ๊ธฐ ์ œํ•œ์„ ์ดˆ๊ณผํ•˜๋„๋ก ํŒŒ์ผ ์“ฐ๊ธฐ ์‹œ๋„๊ฐ€ ์ด๋ค„์กŒ๊ฑฐ๋‚˜, ๊ฐ€๋Šฅํ•œ ์ตœ๋Œ€ ์˜คํ”„์…‹์„ ๋„˜๋Š” ์œ„์น˜์—์„œ ์“ฐ๊ธฐ ์‹œ๋„๊ฐ€ ์ด๋ค„์กŒ๋‹ค.
EINVAL
์š”์ฒญ ๋ฒ”์œ„๊ฐ€ ์ถœ๋ฐœ ํŒŒ์ผ์˜ ๋์„ ๋ฒ—์–ด๋‚œ๋‹ค. ๋˜๋Š” flags ์ธ์ž๊ฐ€ 0์ด ์•„๋‹ˆ๋‹ค.
EIO
๋ณต์‚ฌ ์ค‘์— ์ €์ˆ˜์ค€ I/O ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.
EISDIR
fd_in์ด๋‚˜ fd_out์ด ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋‹ค.
ENOMEM
๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ.
ENOSPC
๋Œ€์ƒ ํŒŒ์ผ ์‹œ์Šคํ…œ์— ๋ณต์‚ฌ๋ฅผ ์™„๋ฃŒํ•˜๊ธฐ ์œ„ํ•œ ์ถฉ๋ถ„ํ•œ ๊ณต๊ฐ„์ด ์—†๋‹ค.
EXDEV
file_in๊ณผ file_out์ด ๊ฐ€๋ฆฌํ‚ค๋Š” ํŒŒ์ผ์ด ๊ฐ™์€ ํŒŒ์ผ ์‹œ์Šคํ…œ ์ƒ์— ์žˆ์ง€ ์•Š๋‹ค.

VERSIONS

๋ฆฌ๋ˆ…์Šค 4.5์—์„œ copy_file_range() ์‹œ์Šคํ…œ ํ˜ธ์ถœ์ด ์ฒ˜์Œ ๋“ฑ์žฅํ–ˆ๋‹ค. glibc 2.27์—์„œ๋Š” ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž ๊ณต๊ฐ„ ์—๋ฎฌ๋ ˆ์ด์…˜์„ ์ œ๊ณตํ•œ๋‹ค.

CONFORMING TO

copy_file_range() ์‹œ์Šคํ…œ ํ˜ธ์ถœ์€ ๋น„ํ‘œ์ค€ ๋ฆฌ๋ˆ…์Šค ๋ฐ GNU ํ™•์žฅ์ด๋‹ค.

NOTES

file_in์ด ํฌ์†Œ ํŒŒ์ผ์ด๋ฉด ์š”์ฒญ ๋ฒ”์œ„ ๋‚ด์— ์กด์žฌํ•˜๋Š” ๊ตฌ๋ฉ์„ copy_file_range()๊ฐ€ ์ฑ„์›Œ ๋ฒ„๋ฆด ์ˆ˜ ์žˆ๋‹ค. ๋ฃจํ”„ ์•ˆ์—์„œ copy_file_range()๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด์„œ lseek(2) SEEK_DATA ๋ฐ SEEK_HOLE ๋™์ž‘์œผ๋กœ ๋ฐ์ดํ„ฐ ์„ธ๊ทธ๋จผํŠธ์˜ ์œ„์น˜๋ฅผ ์•Œ์•„๋‚ด๋Š” ๋ฐฉ์‹์ด ์ข‹์„ ์ˆ˜ ์žˆ๋‹ค.

copy_file_range()๋Š” ํŒŒ์ผ ์‹œ์Šคํ…œ์—์„œ reflink(์ฆ‰ ์—ฌ๋Ÿฌ ์•„์ด๋…ธ๋“œ๊ฐ€ ๋™์ผ copy-on-write ๋””์Šคํฌ ๋ธ”๋ก์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ ๊ณต์œ )๋‚˜ ์„œ๋ฒ„ ์ธก ๋ณต์‚ฌ(NFS์ธ ๊ฒฝ์šฐ) ์‚ฌ์šฉ ๊ฐ™์€ "๋ณต์‚ฌ ๊ฐ€์†" ๊ธฐ๋ฒ•์„ ์ ์šฉํ•  ๊ธฐํšŒ๋ฅผ ์ค€๋‹ค.

EXAMPLE

#define _GNU_SOURCE
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/syscall.h>
#include <unistd.h>

/* glibc 2.27 ์ „ ๋ฒ„์ „์—์„œ๋Š” syscall(2)๋กœ copy_file_range()๋ฅผ
   ํ˜ธ์ถœํ•ด์•ผ ํ•œ๋‹ค. */

static loff_t
copy_file_range(int fd_in, loff_t *off_in, int fd_out,
                loff_t *off_out, size_t len, unsigned int flags)
{
    return syscall(__NR_copy_file_range, fd_in, off_in, fd_out,
                   off_out, len, flags);
}

int
main(int argc, char **argv)
{
    int fd_in, fd_out;
    struct stat stat;
    loff_t len, ret;

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

    fd_in = open(argv[1], O_RDONLY);
    if (fd_in == -1) {
        perror("open (argv[1])");
        exit(EXIT_FAILURE);
    }

    if (fstat(fd_in, &stat) == -1) {
        perror("fstat");
        exit(EXIT_FAILURE);
    }

    len = stat.st_size;

    fd_out = open(argv[2], O_CREAT | O_WRONLY | O_TRUNC, 0644);
    if (fd_out == -1) {
        perror("open (argv[2])");
        exit(EXIT_FAILURE);
    }

    do {
        ret = copy_file_range(fd_in, NULL, fd_out, NULL, len, 0);
        if (ret == -1) {
            perror("copy_file_range");
            exit(EXIT_FAILURE);
        }

        len -= ret;
    } while (len > 0);

    close(fd_in);
    close(fd_out);
    exit(EXIT_SUCCESS);
}

SEE ALSO

lseek(2), sendfile(2), splice(2)


2019-03-06

โš ๏ธ **GitHub.com Fallback** โš ๏ธ