sendfile(2) - wariua/manpages-ko GitHub Wiki
sendfile - νμΌ λμ€ν¬λ¦½ν° κ°μ λ°μ΄ν° 볡μ¬νκΈ°
#include <sys/sendfile.h>
ssize_t sendfile(int out_fd, int in_fd, off_t *offset, size_t count);
sendfile()
μ ν νμΌ λμ€ν¬λ¦½ν°μ λ€λ₯Έ λμ€ν¬λ¦½ν° κ°μ λ°μ΄ν°λ₯Ό 볡μ¬νλ€. 컀λ λ΄μμ 볡μ¬κ° μ΄λ€μ§κΈ° λλ¬Έμ sendfile()
μ μ¬μ©μ 곡κ°κ³Ό λ°μ΄ν°λ₯Ό μ£Όκ³ λ°μμΌ νλ read(2)
λ° write(2)
μ‘°ν©λ³΄λ€ ν¨μ¨μ μ΄λ€.
in_fd
λ μ½κΈ° κ°λ₯νκ² μ΄λ¦° νμΌ λμ€ν¬λ¦½ν°μ¬μΌ νκ³ out_fd
λ μ°κΈ° κ°λ₯νκ² μ΄λ¦° λμ€ν¬λ¦½ν°μ¬μΌ νλ€.
offset
μ΄ NULLμ΄ μλ κ²½μ°μλ sendfile()
μ΄ in_fd
μμ λ°μ΄ν°λ₯Ό μ½κΈ° μμν νμΌ μ€νμ
μ λ΄μ λ³μλ₯Ό κ°λ¦¬ν¨λ€. sendfile()
λ°ν μμ κ·Έ λ³μλ μ½μ΄ λ€μΈ λ§μ§λ§ λ°μ΄νΈ λ€μ λ°μ΄νΈμ μ€νμ
μΌλ‘ μ€μ λλ€. offset
μ΄ NULLμ΄ μλλ©΄ sendfile()
μμ in_fd
μ νμΌ μ€νμ
μ λ³κ²½νμ§ μλλ€. NULLμ΄λ©΄ in_fd
μμ μ½μ λ°μ΄νΈ μλ₯Ό λ°μνλλ‘ νμΌ μ€νμ
μ μ‘°μ νλ€.
offset
μ΄ NULLμΈ κ²½μ°μλ νμΌ μ€νμ
λΆν° μμν΄μ in_fd
λ₯Ό μ½κ² λλ©° νΈμΆ λ΄μμ νμΌ μ€νμ
μ κ°±μ νλ€.
count
λ νμΌ λμ€ν¬λ¦½ν°λ€ κ°μ 볡μ¬ν λ°μ΄νΈ μμ΄λ€.
in_fd
μΈμλ mmap(2) λ°©μ λμμ μ§μνλ νμΌμ λμν΄μΌ νλ€. (μ¦ μμΌμΌ μ μλ€.)
리λ
μ€ μ»€λ 2.6.33 μ μμλ out_fd
κ° μμΌμ κ°λ¦¬μΌμΌ νλ€. 리λ
μ€ 2.6.33λΆν°λ μ무 νμΌμ΄λ κ°λ₯νλ€. μ κ· νμΌμ΄λ©΄ sendfile()
μμ νμΌ μ€νμ
μ μ μ ν λ°κΎΌλ€.
μ±κ³΅μ μΌλ‘ 볡μ¬νμΌλ©΄ out_fd
μ μ¨λ£μ λ°μ΄νΈ μλ₯Ό λ°ννλ€. sendfile()
νΈμΆμ΄ μ±κ³΅νλ κ²½μ°μλ μμ²λ³΄λ€ μ μ λ°μ΄νΈλ₯Ό μΈ μλ μλ€. νΈμΆμλ λ―Έμ μ‘ λ°μ΄νΈκ° μμΌλ©΄ νΈμΆμ μ¬μλν μ€λΉκ° λμ΄ μμ΄μΌ νλ€. NOTES μ°Έκ³ .
μ€λ₯ μ -1μ λ°ννλ©° errno
λ₯Ό μ μ ν μ€μ νλ€.
EAGAIN
-
O_NONBLOCK
μΌλ‘ λ ΌλΈλ‘ I/Oλ₯Ό ννμΌλ©° μ°κΈ°κ° λΈλ‘ λλ € νλ€. EBADF
- μ λ ₯ νμΌμ΄ μ½κΈ° κ°λ₯νκ² μ΄λ¦¬μ§ μμκ±°λ μΆλ ₯ νμΌμ΄ μ°κΈ° κ°λ₯νκ² μ΄λ¦¬μ§ μμλ€.
EFAULT
- μλͺ»λ μ£Όμ.
EINVAL
- λμ€ν¬λ¦½ν°κ° μ ν¨νμ§ μκ±°λ μ 겨 μλ€. λλ
in_fd
μμ mmap(2) λ°©μ λμμ΄ κ°λ₯νμ§ μλ€. λλcount
κ° μμμ΄λ€. EINVAL
-
out_fd
μO_APPEND
νλκ·Έκ° μ€μ λμ΄ μλ€.sendfile()
μμ νμ¬ μ§μνμ§ μλλ€. EIO
-
in_fd
λ₯Ό μ½λ μ€ λΆνΉμ μ€λ₯. ENOMEM
-
in_fd
λ₯Ό μ½κΈ°μ λ©λͺ¨λ¦¬κ° μΆ©λΆνμ§ μμ. EOVERFLOW
-
count
κ° λ무 컀μ μ λ ₯ νμΌμ΄λ μΆλ ₯ νμΌμ μ΅λ ν¬κΈ°λ₯Ό μ΄κ³Όνκ² λ¨. ESPIPE
-
offset
μ΄ NULLμ΄ μλλ° μ λ ₯ νμΌμ΄seek(2)
κ°λ₯νμ§ μλ€.
리λ
μ€ 2.2μμ sendfile()
μ΄ μ²μ λ±μ₯νλ€. glibc 2.1λΆν° ν¬ν¨ νμΌ <sys/sendfile.h>
μ΄ μ‘΄μ¬νλ€.
POSIX.1-2001μ΄λ λ€λ₯Έ νμ€μ λͺ μΈλμ΄ μμ§ μλ€.
λ€λ₯Έ μ λμ€ μμ€ν
λ€μμλ λμ λ°©μκ³Ό ν¨μ μνμ λ€λ₯΄κ² ν΄μ sendfile()
μ ꡬννλ€. μ΄μ κ°λ₯ν νλ‘κ·Έλ¨μμλ μ¬μ©νμ§ λ§μμΌ νλ€.
sendfile()
μ μ΅λ 0x7ffff000 (2,147,479,552) λ°μ΄νΈκΉμ§ 볡μ¬νλ©° μ€μ 볡μ¬ν λ°μ΄νΈ μλ₯Ό λ°ννλ€. (32λΉνΈ μμ€ν
κ³Ό 64λΉνΈ μμ€ν
λͺ¨λμμ κ·Έλ λ€.)
sendfile()
μ μ¬μ©ν΄μ TCP μμΌμΌλ‘ νμΌμ 보λ΄λ € νλλ° νμΌ λ΄μ© μμ μ΄λ€ ν€λ λ°μ΄ν°λ₯Ό 보λ΄μΌ νλ€λ©΄ tcp(7)μ μ€λͺ
λ TCP_CORK
μ΅μ
μ μ°λ κ² μ μ©ν κ²μ΄λ€. ν¨ν· μλ₯Ό μ€μ¬μ μ±λ₯μ μ΅μ νν μ μλ€.
리λ
μ€ 2.4 λ° μ΄μ μμλ out_fd
κ° μ κ· νμΌμ κ°λ¦¬ν¬ μλ μμλ€. 리λ
μ€ 2.6.x 컀λ μ리μ¦μμ κ°λ₯νμ§ μκ² λμλ€κ° 리λ
μ€ 2.6.33μμ λ€μ κ°λ₯ν΄μ‘λ€.
μλμ 리λ
μ€ sendfile()
μμ€ν
νΈμΆμ ν° νμΌ μ€νμ
μ λ€λ£° μ μλλ‘ μ€κ³λμ§ μμλ€. κ·Έλμ 리λ
μ€ 2.4μμ offset
μΈμμ λ ν° νμ
μ μ°λ sendfile64()
λ₯Ό μΆκ°νλ€. glibcμ sendfile()
λνΌ ν¨μμμ 컀λ μ°¨μ΄λ₯Ό ν¬λͺ
νκ² μ²λ¦¬ν΄ μ€λ€.
sendfile()
μ΄ EINVAL
μ΄λ ENOSYS
λ‘ μ€ν¨νλ κ²½μ°μ μμ©μμ read(2)
/write(2)
λ°©μμΌλ‘ λλμκ° μλ μλ€.
out_fd
κ° μ λ‘ μΉ΄νΌλ₯Ό μ§μνλ μμΌμ΄λ νμ΄νλ₯Ό κ°λ¦¬ν€λ κ²½μ° νΈμΆμλ out_fd
μ λ°λνΈμμ λ°μ΄ν°λ₯Ό λͺ¨λ μ½μ΄μ μλͺ¨ν λκΉμ§ in_fd
κ° κ°λ¦¬ν€λ νμΌμ 볡μ¬ν λΆλΆμ΄ λ°λμ§ μκ³ μ μ§λλλ‘ ν΄μΌ νλ€.
리λ μ€ μ μ© splice(2) νΈμΆμ νμͺ½μ΄ (λλ μμͺ½ λͺ¨λ) νμ΄νλΌλ©΄ μμ νμΌ λμ€ν¬λ¦½ν° κ°μ λ°μ΄ν° 볡μ¬λ₯Ό μ§μνλ€.
copy_file_range(2), mmap(2), open(2), socket(2), splice(2)
2017-09-15