process_vm_readv(2) - wariua/manpages-ko GitHub Wiki
process_vm_readv, process_vm_writev - ํ๋ก์ธ์ค ์ฃผ์ ๊ณต๊ฐ๋ค ๊ฐ์ ๋ฐ์ดํฐ ์ ์กํ๊ธฐ
#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
์ด ์์คํ
ํธ์ถ๋ค์ ํธ์ถ ํ๋ก์ธ์ค("์ง์ญ ํ๋ก์ธ์ค")์ 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) ์ฐธ๊ณ .
์ฑ๊ณต ์ process_vm_readv()
๋ ์ฝ์ ๋ฐ์ดํธ ์๋ฅผ ๋ฐํํ๊ณ process_vm_writev()
๋ ์ด ๋ฐ์ดํธ ์๋ฅผ ๋ฐํํ๋ค. ๋ถ์์ ์ฝ๊ธฐ/์ฐ๊ธฐ๊ฐ ์ผ์ด๋ ๊ฒฝ์ฐ ๋ฐํ ๊ฐ์ด ์์ฒญํ ๋ฐ์ดํธ ์ด์๋ณด๋ค ์์ ์ ์๋ค. (๋ถ์์ ์ ์ก์ iovec
ํญ๋ชฉ ๋จ์๋ก ์ด๋ค์ง๋ค. ์ด ์์คํ
ํธ์ถ๋ค์ iovec
ํญ๋ชฉ ํ๋๋ฅผ ์ชผ๊ฐ๋ ๋ถ์์ ์ ์ก์ ์ํํ์ง ์๋๋ค.) ํธ์ถ์๋ ๋ฐํ ๊ฐ์ ํ์ธํด์ ๋ถ์์ ์ฝ๊ธฐ/์ฐ๊ธฐ๊ฐ ์ผ์ด๋ฌ๋์ง ์ฌ๋ถ๋ฅผ ์์๋ณด๋ ๊ฒ ์ข๋ค.
์ค๋ฅ ์ -1์ ๋ฐํํ๋ฉฐ errno
๋ฅผ ์ ์ ํ ์ค์ ํ๋ค.
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
์ธ ํ๋ก์ธ์ค๊ฐ ์กด์ฌํ์ง ์๋๋ค.
๋ฆฌ๋ ์ค 3.2์์ ์ด ์์คํ ํธ์ถ๋ค์ด ์ถ๊ฐ๋์๋ค. glibc ๋ฒ์ 2.15๋ถํฐ ์ง์์ ์ ๊ณตํ๋ค.
์ด ์์คํ ํธ์ถ๋ค์ ๋นํ์ค ๋ฆฌ๋ ์ค ํ์ฅ์ด๋ค.
process_vm_readv()
์ process_vm_writev()
๊ฐ ์ํํ๋ ๋ฐ์ดํฐ ์ ์ก์ ์ด๋ค ์์ผ๋ก๋ ์์์ฑ์ด ๋ณด์ฅ๋์ง ์๋๋ค.
์ด ์์คํ ํธ์ถ๋ค์ ํ ๋ฒ์ ๋ณต์ฌ ๋์์ผ๋ก ๋ฉ์์ง๋ฅผ ๊ตํํ ์ ์๊ฒ ํ์ฌ ๋น ๋ฅธ ๋ฉ์์ง ์ ๋ฌ์ ๊ฐ๋ฅ์ผ ํ๋๋ก ์ค๊ณ๋์๋ค. (์๋ฅผ ๋ค์ด ๊ณต์ ๋ฉ๋ชจ๋ฆฌ๋ ํ์ดํ๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ๋ ๋ฒ์ ๋ณต์ฌ๊ฐ ํ์ํ ๊ฒ์ด๋ค.)
๋ค์ ์ฝ๋ ์ํ์ด 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;
}
2017-09-15