PROCESS_VM_READV(2) | Linux Programmer's Manual | PROCESS_VM_READV(2) |
NAME
process_vm_readv, process_vm_writev - transfer data between process address spacesSYNOPSIS
#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);
DESCRIPTION
These system calls transfer data between the address space of the calling 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.struct iovec {
void *iov_base; /* Starting address */
size_t iov_len; /* Number of bytes to transfer */
};
RETURN VALUE
On success, process_vm_readv() returns the number of bytes read and process_vm_writev() returns the number of bytes written. This return value may be less than the total number of requested bytes, if a partial 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.ERRORS
- EINVAL
- The sum of the iov_len values of either local_iov or remote_iov overflows a ssize_t value.
- EINVAL
- flags is not 0.
- EINVAL
- liovcnt or riovcnt is too large.
- EFAULT
- The memory described by local_iov is outside the caller's accessible address space.
- EFAULT
- The memory described by remote_iov 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 process_vm_readv() and process_vm_writev() are not guaranteed to be atomic in any way.EXAMPLE
The following code sample demonstrates the use of process_vm_readv(). 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 <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 of remote process */
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[1].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)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/.2012-04-25 | Linux |