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

NAME

sendfile - 파일 λ””μŠ€ν¬λ¦½ν„° 간에 데이터 λ³΅μ‚¬ν•˜κΈ°

SYNOPSIS

#include <sys/sendfile.h>

ssize_t sendfile(int out_fd, int in_fd, off_t *offset, size_t count);

DESCRIPTION

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()μ—μ„œ 파일 μ˜€ν”„μ…‹μ„ 적절히 λ°”κΎΌλ‹€.

RETURN VALUE

μ„±κ³΅μ μœΌλ‘œ λ³΅μ‚¬ν–ˆμœΌλ©΄ out_fd에 써넣은 λ°”μ΄νŠΈ 수λ₯Ό λ°˜ν™˜ν•œλ‹€. sendfile() 호좜이 μ„±κ³΅ν•˜λŠ” κ²½μš°μ—λ„ μš”μ²­λ³΄λ‹€ 적은 λ°”μ΄νŠΈλ₯Ό μ“Έ μˆ˜λ„ μžˆλ‹€. ν˜ΈμΆœμžλŠ” 미전솑 λ°”μ΄νŠΈκ°€ 있으면 ν˜ΈμΆœμ„ μž¬μ‹œλ„ν•  μ€€λΉ„κ°€ λ˜μ–΄ μžˆμ–΄μ•Ό ν•œλ‹€. NOTES μ°Έκ³ .

였λ₯˜ μ‹œ -1을 λ°˜ν™˜ν•˜λ©° errnoλ₯Ό 적절히 μ„€μ •ν•œλ‹€.

ERRORS

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) κ°€λŠ₯ν•˜μ§€ μ•Šλ‹€.

VERSIONS

λ¦¬λˆ…μŠ€ 2.2μ—μ„œ sendfile()이 처음 λ“±μž₯ν–ˆλ‹€. glibc 2.1λΆ€ν„° 포함 파일 <sys/sendfile.h>이 μ‘΄μž¬ν•œλ‹€.

CONFORMING TO

POSIX.1-2001μ΄λ‚˜ λ‹€λ₯Έ ν‘œμ€€μ— λͺ…μ„Έλ˜μ–΄ μžˆμ§€ μ•Šλ‹€.

λ‹€λ₯Έ μœ λ‹‰μŠ€ μ‹œμŠ€ν…œλ“€μ—μ„œλŠ” λ™μž‘ 방식과 ν•¨μˆ˜ μ›ν˜•μ„ λ‹€λ₯΄κ²Œ ν•΄μ„œ sendfile()을 κ΅¬ν˜„ν•œλ‹€. 이식 κ°€λŠ₯ν•œ ν”„λ‘œκ·Έλž¨μ—μ„œλŠ” μ‚¬μš©ν•˜μ§€ 말아야 ν•œλ‹€.

NOTES

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) ν˜ΈμΆœμ€ ν•œμͺ½μ΄ (λ˜λŠ” μ–‘μͺ½ λͺ¨λ‘) νŒŒμ΄ν”„λΌλ©΄ μž„μ˜ 파일 λ””μŠ€ν¬λ¦½ν„° 간에 데이터 볡사λ₯Ό μ§€μ›ν•œλ‹€.

SEE ALSO

copy_file_range(2), mmap(2), open(2), socket(2), splice(2)


2017-09-15

⚠️ **GitHub.com Fallback** ⚠️