process_vm_readv(2) System Calls Manual process_vm_readv(2) process_vm_readv, process_vm_writev - LIBRARY Standard C library (libc, -lc) #include 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. The process_vm_writev() system call is the converse of process_vm_readv()--it transfers data from the local process to the remote process. Other than the direction of the transfer, the arguments liovcnt, local_iov, riovcnt, and remote_iov have the same meaning as for process_vm_readv(). The local_iov and remote_iov arguments point to an array of iovec structures, described in iovec(3type). , . , 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 ( sysconf(_SC_IOV_MAX)). local_iov . local_iov , , . , /. / ( ), remote_iov . / . , (, C, null) , (, 4 ) iovec ( remote_iov local_iov entry. , ). 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 iov_len local_iov remote_iov ssize_t. EINVAL flags 0. EINVAL liovcnt riovcnt . ENOMEM iovec. EPERM pid. ESRCH pid . Linux. Linux 3.2, glibc 2.15. process_vm_readv() process_vm_writev() . , ( , , , ). process_vm_readv(). 20 0x10000 PID 10 10 buf1, 10 buf2. #define _GNU_SOURCE #include #include #include int main(void) { char buf1[10]; char buf2[10]; pid_t pid = 10; /* PID of remote process */ ssize_t nread; struct iovec local[2]; struct iovec remote[1]; 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) exit(EXIT_FAILURE); exit(EXIT_SUCCESS); } . readv(2), writev(2) Alexey, Azamat Hackimov , kogamatranslator49 , Kogan, Max Is , Yuri Kozlov ; GNU 3 , . . , , . Linux man-pages 6.06 31 2023 . process_vm_readv(2)