Manual Pages for Linux CentOS command on man process_vm_readv
MyWebUniversity

Manual Pages for Linux CentOS command on man process_vm_readv

PROCESSVMREADV(2) Linux Programmer's Manual PROCESSVMREADV(2)

NAME

processvmreadv, processvmwritev - transfer data between process address spaces SYNOPSIS

#include ssizet processvmreadv(pidt pid, const struct iovec *localiov, unsigned long liovcnt, const struct iovec *remoteiov, unsigned long riovcnt, unsigned long flags); ssizet processvmwritev(pidt pid, const struct iovec *localiov, unsigned long liovcnt, const struct iovec *remoteiov, unsigned long riovcnt, unsigned long flags); DESCRIPTION These system calls transfer data between the address space of the call‐ ing process ("the local process") and the process identified by pid ("the remote process"). The data moves directly between the address spaces of the two processes, without passing through kernel space. The processvmreadv() system call transfers data from the remote process to the local process. The data to be transferred is identified by remoteiov and riovcnt: remoteiov is a pointer to an array describ‐ ing address ranges in the process pid, and riovcnt specifies the number of elements in remoteiov. The data is transferred to the locations specified by localiov and liovcnt: localiov is a pointer to an array describing address ranges in the calling process, and liovcnt specifies the number of elements in localiov. The processvmwritev() system call is the converse of processvmreadv()—it transfers data from the local process to the remote process. Other than the direction of the transfer, the argu‐ ments liovcnt, localiov, riovcnt, and remoteiov have the same meaning as for processvmreadv(). The localiov and remoteiov arguments point to an array of iovec structures, defined in as: struct iovec { void *iovbase; /* Starting address */ sizet iovlen; /* Number of bytes to transfer */ }; Buffers are processed in array order. This means that processvmreadv() completely fills localiov[0] before proceeding to localiov[1], and so on. Likewise, remoteiov[0] is completely read before proceeding to remoteiov[1], and so on. Similarly, processvmwritev() writes out the entire contents of localiov[0] before proceeding to localiov[1], and it completely fills remoteiov[0] before proceeding to remoteiov[1]. The lengths of remoteiov[i].iovlen and localiov[i].iovlen do not have to be the same. Thus, it is possible to split a single local buf‐ fer into multiple remote buffers, or vice versa. The flags argument is currently unused and must be set to 0. The values specified in the liovcnt and riovcnt arguments must be less than or equal to IOVMAX (defined in or accessible via the call sysconf(SCIOVMAX)). The count arguments and localiov are checked before doing any trans‐ fers. If the counts are too big, or localiov is invalid, or the addresses refer to regions that are inaccessible to the local process, none of the vectors will be processed and an error will be returned immediately. Note, however, that these system calls do not check the memory regions in the remote process until just before doing the read/write. Conse‐ quently, a partial read/write (see RETURN VALUE) may result if one of the remoteiov elements points to an invalid memory region in the remote process. No further reads/writes will be attempted beyond that point. Keep this in mind when attempting to read data of unknown

length (such as C strings that are null-terminated) from a remote process, by avoiding spanning memory pages (typically 4KiB) in a single remote iovec element. (Instead, split the remote read into two remoteiov elements and have them merge back into a single write localiov entry. The first read entry goes up to the page boundary, while the second starts on the next page boundary.) In order to read from or write to another process, either the caller must have the capability CAPSYSPTRACE, or the real user ID, effective

user ID, and saved set-user-ID of the remote process must match the real user ID of the caller and the real group ID, effective group ID,

and saved set-group-ID of the remote process must match the real group ID of the caller. (The permission required is exactly the same as that required to perform a ptrace(2) PTRACEATTACH on the remote process.) RETURN VALUE On success, processvmreadv() returns the number of bytes read and processvmwritev() returns the number of bytes written. This return value may be less than the total number of requested bytes, if a par‐ tial read/write occurred. (Partial transfers apply at the granularity of iovec elements. These system calls won't perform a partial transfer that splits a single iovec element.) The caller should check the return value to determine whether a partial read/write occurred.

On error, -1 is returned and errno is set appropriately. ERRORS EINVAL The sum of the iovlen values of either localiov or remoteiov overflows a ssizet value. EINVAL flags is not 0. EINVAL liovcnt or riovcnt is too large. EFAULT The memory described by localiov is outside the caller's acces‐ sible address space. EFAULT The memory described by remoteiov is outside the accessible address space of the process pid. ENOMEM Could not allocate memory for internal copies of the iovec structures. EPERM The caller does not have permission to access the address space of the process pid. ESRCH No process with ID pid exists. VERSIONS These system calls were added in Linux 3.2. Support is provided in glibc since version 2.15. CONFORMING TO These system calls are nonstandard Linux extensions. NOTES The data transfers performed by processvmreadv() and processvmwritev() are not guaranteed to be atomic in any way. These system calls were designed to permit fast message passing by allowing messages to be exchanged with a single copy operation (rather than the double copy that would be required when using, for example, shared memory or pipes). EXAMPLE The following code sample demonstrates the use of processvmreadv(). It reads 20 bytes at the address 0x10000 from the process with PID 10 and writes the first 10 bytes into buf1 and the second 10 bytes into buf2.

#include int main(void) { struct iovec local[2]; struct iovec remote[1]; char buf1[10]; char buf2[10]; ssizet nread; pidt pid = 10; /* PID of remote process */ local[0].iovbase = buf1; local[0].iovlen = 10; local[1].iovbase = buf2; local[1].iovlen = 10; remote[0].iovbase = (void *) 0x10000; remote[1].iovlen = 20; nread = processvmreadv(pid, local, 2, remote, 1, 0); if (nread != 20) return 1; else return 0; } SEE ALSO readv(2), writev(2) COLOPHON

This page is part of release 3.53 of the Linux man-pages project. A description of the project, and information about reporting bugs, can

be found at http://www.kernel.org/doc/man-pages/.

Linux 2012-04-25 PROCESSVMREADV(2)




Contact us      |      About us      |      Term of use      |       Copyright © 2000-2019 MyWebUniversity.com ™