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

NAME

process_vm_readv, process_vm_writev - ํ”„๋กœ์„ธ์Šค ์ฃผ์†Œ ๊ณต๊ฐ„๋“ค ๊ฐ„์— ๋ฐ์ดํ„ฐ ์ „์†กํ•˜๊ธฐ

SYNOPSIS

#include <sys/uio.h>

ssize_t process_vm_readv(pid_t pid,
                         const struct iovec *local_iov,
                         unsigned long liovcnt,
                         const struct iovec *remote_iov,
                         unsigned long riovcnt,
                         unsigned long flags);

ssize_t process_vm_writev(pid_t pid,
                          const struct iovec *local_iov,
                          unsigned long liovcnt,
                          const struct iovec *remote_iov,
                          unsigned long riovcnt,
                          unsigned long flags);

glibc ๊ธฐ๋Šฅ ํ™•์ธ ๋งคํฌ๋กœ ์š”๊ฑด (feature_test_macros(7) ์ฐธ๊ณ ):

process_vm_readv(), process_vm_writev():
_GNU_SOURCE

DESCRIPTION

์ด ์‹œ์Šคํ…œ ํ˜ธ์ถœ๋“ค์€ ํ˜ธ์ถœ ํ”„๋กœ์„ธ์Šค("์ง€์—ญ ํ”„๋กœ์„ธ์Šค")์™€ pid๋กœ ๋‚˜ํƒ€๋‚ธ ํ”„๋กœ์„ธ์Šค("์›๊ฒฉ ํ”„๋กœ์„ธ์Šค")์˜ ์ฃผ์†Œ ๊ณต๊ฐ„๋“ค ์‚ฌ์ด์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•œ๋‹ค. ๋ฐ์ดํ„ฐ๊ฐ€ ์ปค๋„์„ ๊ฑฐ์น˜์ง€ ์•Š๊ณ  ๋‘ ํ”„๋กœ์„ธ์Šค ์ฃผ์†Œ ๊ณต๊ฐ„ ๊ฐ„์— ์ง์ ‘ ์ด๋™ํ•œ๋‹ค.

process_vm_readv() ์‹œ์Šคํ…œ ํ˜ธ์ถœ์€ ์›๊ฒฉ ํ”„๋กœ์„ธ์Šค์—์„œ ์ง€์—ญ ํ”„๋กœ์„ธ์Šค๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•œ๋‹ค. ์ „์†กํ•  ๋ฐ์ดํ„ฐ๋ฅผ remote_iov์™€ riovcnt๋กœ ๋‚˜ํƒ€๋‚ธ๋‹ค. remote_iov๋Š” ํ”„๋กœ์„ธ์Šค pid ๋‚ด ์ฃผ์†Œ ๋ฒ”์œ„๋ฅผ ๊ธฐ์ˆ ํ•˜๋Š” ๋ฐฐ์—ด์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ์ด๊ณ  riovcnt๋Š” remote_iov์˜ ํ•ญ๋ชฉ ๊ฐœ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค. ๊ทธ ๋ฐ์ดํ„ฐ๊ฐ€ local_iov์™€ liovcnt๋กœ ๋‚˜ํƒ€๋‚ธ ์œ„์น˜๋กœ ์ „์†ก๋œ๋‹ค. local_iov๋Š” ํ˜ธ์ถœ ํ”„๋กœ์„ธ์Šค ๋‚ด ์ฃผ์†Œ ๋ฒ”์œ„๋ฅผ ๊ธฐ์ˆ ํ•˜๋Š” ๋ฐฐ์—ด์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ์ด๊ณ  liovcnt๋Š” local_iov์˜ ํ•ญ๋ชฉ ๊ฐœ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.

process_vm_writev() ์‹œ์Šคํ…œ ํ˜ธ์ถœ์€ process_vm_readv()์˜ ๋ฐ˜๋Œ€์ด๋‹ค. ์ฆ‰, ์ง€์—ญ ํ”„๋กœ์„ธ์Šค์—์„œ ์›๊ฒฉ ํ”„๋กœ์„ธ์Šค๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•œ๋‹ค. ์ „์†ก ๋ฐฉํ–ฅ์„ ์ œ์™ธํ•˜๊ณ  ์ธ์ž liovcnt, local_iov, riovcnt, remote_iov์˜ ์˜๋ฏธ๋Š” process_vm_readv()์—์„œ์™€ ๊ฐ™๋‹ค.

local_iov์™€ remote_iov ์ธ์ž๋Š” iovec ๊ตฌ์กฐ์ฒด ๋ฐฐ์—ด์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค. ์ด ๊ตฌ์กฐ์ฒด๋Š” <sys/uio.h>์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜๋˜์–ด ์žˆ๋‹ค.

struct iovec {
    void  *iov_base;    /* ์‹œ์ž‘ ์ฃผ์†Œ */
    size_t iov_len;     /* ์˜ฎ๊ธธ ๋ฐ”์ดํŠธ ์ˆ˜ */
};

๋ฐฐ์—ด ์ˆœ์„œ๋Œ€๋กœ ๋ฒ„ํผ๋“ค์„ ์ฒ˜๋ฆฌํ•œ๋‹ค. ์ฆ‰ process_vm_readv()์—์„œ local_iov[0]๋ฅผ ์™„์ „ํžˆ ์ฑ„์šด ๋‹ค์Œ local_iov[1]๋กœ ์ง„ํ–‰ํ•˜๋Š” ์‹์ด๋‹ค. ๋˜ํ•œ remote_iov[0]๋ฅผ ์™„์ „ํžˆ ์ฝ์€ ๋‹ค์Œ remote_iov[1]๋กœ ์ง„ํ–‰ํ•œ๋‹ค.

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ process_vm_writev()์—์„œ๋Š” local_iov[0]์˜ ๋‚ด์šฉ์„ ๋ชจ๋‘ ์“ด ๋‹ค์Œ local_iov[1]๋กœ ์ง„ํ–‰ํ•˜๊ณ  remote_iov[0]๋ฅผ ์™„์ „ํžˆ ์ฑ„์šด ๋‹ค์Œ remote_iov[1]๋กœ ์ง„ํ–‰ํ•œ๋‹ค.

remote_iov[i].iov_len๊ณผ local_iov[i].iov_len์˜ ๊ธธ์ด ๊ฐ’์ด ๊ฐ™์„ ํ•„์š”๊ฐ€ ์—†๋‹ค. ์ฆ‰, ์ง€์—ญ ๋ฒ„ํผ ํ•œ ๊ฐœ๋ฅผ ์›๊ฒฉ ๋ฒ„ํผ ์—ฌ๋Ÿฌ ๊ฐœ๋กœ ์ชผ๊ฐœ๊ฑฐ๋‚˜ ๊ทธ ๋ฐ˜๋Œ€๋กœ ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

flags ์ธ์ž๋Š” ํ˜„์žฌ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉฐ 0์œผ๋กœ ์„ค์ •ํ•ด์•ผ ํ•œ๋‹ค.

liovcnt ๋ฐ riovcnt ์ธ์ž์— ์ง€์ •ํ•œ ๊ฐ’์€ IOV_MAX ์ดํ•˜์—ฌ์•ผ ํ•œ๋‹ค. (IOV_MAX๋Š” <limits.h>์— ์ •์˜๋˜์–ด ์žˆ๊ฑฐ๋‚˜ sysconf(_SC_IOV_MAX) ํ˜ธ์ถœ๋กœ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.)

์ „์†ก์„ ํ•˜๊ธฐ ์ „์— ๊ฐœ์ˆ˜ ์ธ์ž๋“ค๊ณผ local_iov๋ฅผ ํ™•์ธํ•œ๋‹ค. ๊ฐœ์ˆ˜๊ฐ€ ๋„ˆ๋ฌด ํฌ๊ฑฐ๋‚˜, local_iov๊ฐ€ ์œ ํšจํ•˜์ง€ ์•Š๊ฑฐ๋‚˜, ๊ทธ ์ฃผ์†Œ๊ฐ€ ์ง€์—ญ ํ”„๋กœ์„ธ์Šค์—์„œ ์ ‘๊ทผ ๋ถˆ๊ฐ€๋Šฅํ•œ ์˜์—ญ์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฒฝ์šฐ ์–ด๋–ค ๋ฒกํ„ฐ๋„ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š๊ณ  ์ฆ‰์‹œ ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

ํ•˜์ง€๋งŒ ์ด ์‹œ์Šคํ…œ ํ˜ธ์ถœ๋“ค์€ ์ฝ๊ธฐ/์“ฐ๊ธฐ๋ฅผ ํ•˜๊ธฐ ์ง์ „๊นŒ์ง€ ์›๊ฒฉ ํ”„๋กœ์„ธ์Šค์˜ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์„ ํ™•์ธํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋”ฐ๋ผ์„œ remote_iov์˜ ํ•œ ํ•ญ๋ชฉ์ด ์›๊ฒฉ ํ”„๋กœ์„ธ์Šค์—์„œ ์œ ํšจํ•˜์ง€ ์•Š์€ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฒฝ์šฐ ๋ถˆ์™„์ „ ์ฝ๊ธฐ/์“ฐ๊ธฐ๊ฐ€ ์ผ์–ด๋‚  ์ˆ˜๋„ ์žˆ๋‹ค. (RETURN VALUE ์ฐธ๊ณ .) ๊ทธ ์ง€์  ์ดํ›„๋กœ๋Š” ์ฝ๊ธฐ/์“ฐ๊ธฐ๋ฅผ ๋” ์‹œ๋„ํ•˜์ง€ ์•Š๋Š”๋‹ค. ๊ธธ์ด๋ฅผ ๋ชจ๋ฅด๋Š” (๋„ ์ข…๋ฃŒ C ๋ฌธ์ž์—ด ๊ฐ™์€) ๋ฐ์ดํ„ฐ๋ฅผ ์›๊ฒฉ ํ”„๋กœ์„ธ์Šค๋กœ๋ถ€ํ„ฐ ์ฝ์œผ๋ ค ํ•  ๋•Œ ์ด๋ฅผ ๊ณ ๋ คํ•˜์—ฌ ์›๊ฒฉ iovec ํ•ญ๋ชฉ ํ•˜๋‚˜๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ํŽ˜์ด์ง€(๋ณดํ†ต 4 KiB) ์—ฌ๋Ÿฌ ๊ฐœ์— ๊ฑธ์น˜์ง€ ์•Š๊ฒŒ ํ•˜๋Š” ๊ฒŒ ์ข‹๋‹ค. (๊ทธ ์›๊ฒฉ ์ฝ๊ธฐ๋ฅผ remote_iov ํ•ญ๋ชฉ ๋‘ ๊ฐœ๋กœ ์ชผ๊ฐœ๊ณ  local_iov ํ•œ ๊ฐœ์— ์“ฐ๋Š” ๊ฒƒ์œผ๋กœ ํ•ฉ์ณ์ง€๊ฒŒ ํ•˜๋ฉด ๋œ๋‹ค. ์ฒซ ๋ฒˆ์งธ ์ฝ๊ธฐ ํ•ญ๋ชฉ์ด ํŽ˜์ด์ง€ ๊ฒฝ๊ณ„๊นŒ์ง€ ๊ฐ€๊ณ  ๋‘ ๋ฒˆ์งธ๊ฐ€ ๋‹ค์Œ ํŽ˜์ด์ง€ ๊ฒฝ๊ณ„์—์„œ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.)

๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์— ์ฝ๊ฑฐ๋‚˜ ์“ฐ๋Š” ๊ถŒํ•œ์€ ptrace ์ ‘๊ทผ ๋ชจ๋“œ PTRACE_MODE_ATTACH_REALCREDS ๊ฒ€์‚ฌ๋กœ ๊ฒฐ์ •๋œ๋‹ค. ptrace(2) ์ฐธ๊ณ .

RETURN VALUE

์„ฑ๊ณต ์‹œ process_vm_readv()๋Š” ์ฝ์€ ๋ฐ”์ดํŠธ ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  process_vm_writev()๋Š” ์“ด ๋ฐ”์ดํŠธ ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๋ถˆ์™„์ „ ์ฝ๊ธฐ/์“ฐ๊ธฐ๊ฐ€ ์ผ์–ด๋‚œ ๊ฒฝ์šฐ ๋ฐ˜ํ™˜ ๊ฐ’์ด ์š”์ฒญํ•œ ๋ฐ”์ดํŠธ ์ด์ˆ˜๋ณด๋‹ค ์ž‘์„ ์ˆ˜ ์žˆ๋‹ค. (๋ถˆ์™„์ „ ์ „์†ก์€ iovec ํ•ญ๋ชฉ ๋‹จ์œ„๋กœ ์ด๋ค„์ง„๋‹ค. ์ด ์‹œ์Šคํ…œ ํ˜ธ์ถœ๋“ค์€ iovec ํ•ญ๋ชฉ ํ•˜๋‚˜๋ฅผ ์ชผ๊ฐœ๋Š” ๋ถˆ์™„์ „ ์ „์†ก์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๋Š”๋‹ค.) ํ˜ธ์ถœ์ž๋Š” ๋ฐ˜ํ™˜ ๊ฐ’์„ ํ™•์ธํ•ด์„œ ๋ถˆ์™„์ „ ์ฝ๊ธฐ/์“ฐ๊ธฐ๊ฐ€ ์ผ์–ด๋‚ฌ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์•Œ์•„๋ณด๋Š” ๊ฒŒ ์ข‹๋‹ค.

์˜ค๋ฅ˜ ์‹œ -1์„ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ errno๋ฅผ ์ ์ ˆํžˆ ์„ค์ •ํ•œ๋‹ค.

ERRORS

EFAULT
local_iov๊ฐ€ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ˜ธ์ถœ์ž์˜ ์ ‘๊ทผ ๊ฐ€๋Šฅ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„ ๋ฐ–์— ์žˆ๋‹ค.
EFAULT
remote_iov๊ฐ€ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ”„๋กœ์„ธ์Šค pid์˜ ์ ‘๊ทผ ๊ฐ€๋Šฅ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„ ๋ฐ–์— ์žˆ๋‹ค.
EINVAL
local_iov๋‚˜ remote_iov์˜ iov_len ๊ฐ’๋“ค์˜ ํ•ฉ์ด ssize_t ๊ฐ’ ๋ฒ”์œ„๋ฅผ ๋„˜์–ด๊ฐ„๋‹ค.
EINVAL
flags๊ฐ€ 0์ด ์•„๋‹ˆ๋‹ค.
EINVAL
liovcnt๋‚˜ riovcnt๊ฐ€ ๋„ˆ๋ฌด ํฌ๋‹ค.
ENOMEM
iovec ๊ตฌ์กฐ์ฒด์˜ ๋‚ด๋ถ€ ์‚ฌ๋ณธ์„ ์œ„ํ•œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜์ง€ ๋ชปํ–ˆ๋‹ค.
EPERM
ํ˜ธ์ถœ์ž๊ฐ€ ํ”„๋กœ์„ธ์Šค pid์˜ ์ฃผ์†Œ ๊ณต๊ฐ„์— ์ ‘๊ทผํ•  ๊ถŒํ•œ์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š๋‹ค.
ESRCH
ID๊ฐ€ pid์ธ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค.

VERSIONS

๋ฆฌ๋ˆ…์Šค 3.2์—์„œ ์ด ์‹œ์Šคํ…œ ํ˜ธ์ถœ๋“ค์ด ์ถ”๊ฐ€๋˜์—ˆ๋‹ค. glibc ๋ฒ„์ „ 2.15๋ถ€ํ„ฐ ์ง€์›์„ ์ œ๊ณตํ•œ๋‹ค.

CONFORMING TO

์ด ์‹œ์Šคํ…œ ํ˜ธ์ถœ๋“ค์€ ๋น„ํ‘œ์ค€ ๋ฆฌ๋ˆ…์Šค ํ™•์žฅ์ด๋‹ค.

NOTES

process_vm_readv()์™€ process_vm_writev()๊ฐ€ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ์ดํ„ฐ ์ „์†ก์€ ์–ด๋–ค ์‹์œผ๋กœ๋„ ์›์ž์„ฑ์ด ๋ณด์žฅ๋˜์ง€ ์•Š๋Š”๋‹ค.

์ด ์‹œ์Šคํ…œ ํ˜ธ์ถœ๋“ค์€ ํ•œ ๋ฒˆ์˜ ๋ณต์‚ฌ ๋™์ž‘์œผ๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ๊ตํ™˜ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜์—ฌ ๋น ๋ฅธ ๋ฉ”์‹œ์ง€ ์ „๋‹ฌ์„ ๊ฐ€๋Šฅ์ผ€ ํ•˜๋„๋ก ์„ค๊ณ„๋˜์—ˆ๋‹ค. (์˜ˆ๋ฅผ ๋“ค์–ด ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ๋‚˜ ํŒŒ์ดํ”„๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ๋‘ ๋ฒˆ์˜ ๋ณต์‚ฌ๊ฐ€ ํ•„์š”ํ•  ๊ฒƒ์ด๋‹ค.)

EXAMPLE

๋‹ค์Œ ์ฝ”๋“œ ์ƒ˜ํ”Œ์ด process_vm_readv() ์‚ฌ์šฉ ๋ฐฉ์‹์„ ๋ณด์—ฌ ์ค€๋‹ค. PID๊ฐ€ 10์ธ ํ”„๋กœ์„ธ์Šค๋กœ๋ถ€ํ„ฐ ์ฃผ์†Œ 0x10000์— ์žˆ๋Š” 20๋ฐ”์ดํŠธ๋ฅผ ์ฝ์–ด์„œ ์ฒ˜์Œ 10๋ฐ”์ดํŠธ๋ฅผ buf1์— ์“ฐ๊ณ  ๋‘ ๋ฒˆ์งธ 10๋ฐ”์ดํŠธ๋ฅผ buf2์— ์“ด๋‹ค.

#include <sys/uio.h>

int
main(void)
{
    struct iovec local[2];
    struct iovec remote[1];
    char buf1[10];
    char buf2[10];
    ssize_t nread;
    pid_t pid = 10;            /* ์›๊ฒฉ ํ”„๋กœ์„ธ์Šค์˜ PID */

    local[0].iov_base = buf1;
    local[0].iov_len = 10;
    local[1].iov_base = buf2;
    local[1].iov_len = 10;
    remote[0].iov_base = (void *) 0x10000;
    remote[0].iov_len = 20;

    nread = process_vm_readv(pid, local, 2, remote, 1, 0);
    if (nread != 20)
        return 1;
    else
        return 0;
}

SEE ALSO

readv(2), writev(2)


2017-09-15

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