process_vm_readv/writev进程间数据传输
process_vm_readv/writev进程间数据传输
process_vm_readv
readv,writev,preadv,pwritev,preadv2,pwrite2
函数声明
#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);
参数说明
pid 进程pid号
struct iovec *local_iov 结构体local进程指向一个数组基地址
liovcnt local进程数组大小
struct iovec *remote_iov 结构体remote进程指向一个数组基地址
riovcnt remote进程数组大小
flags 默认0
介绍
这些系统调用在不同进程地址空间之间传输数据。调用进程:“local进程”以及“remote进程”。数据直接在两个进程的地址空间传输,无需通过内核空间。前提是必须知道传输数据的大小。
process_vm_readv()从remote进程传送数据到local进程。要传输的数据由remote_iov和riovcnt标识:remote_iov指向一个数组,用于描述remote进程的地址范围,而riovcnt指定remote_iov中的元素数。数据传输到由local_iov和liovcnt指定的位置:local_iov是指向描述地址范围的数组的指针。并且liovcnt指定local_iov中的元素数。
process_vm_writev()系统调用是process_vm_readv()的逆过程。它从local进程传送数据到remote进程。除了转移的方向,参数liovcnt,local_iov,riovcnt和remote_iov具有相同的参数含义,与process_vm_readv()相同。
local_iov和remote_iov参数指向iovec结构的数组,在<sys / uio.h>中定义为:
<sys / uio.h>struct iovec {void *iov_base; /* 地址基址 */size_t iov_len; /* 数据传输字节数 */};
缓冲区以数组顺序处理。 这意味着process_vm_readv()在进行到local_iov [1]之前会完全填充local_iov [0],依此类推。 同样,在进行remote_iov [1]之前,将完全读取remote_iov [0],依此类推。
同样,process_vm_writev()在local_iov [1]之前写出local_iov [0]的全部内容,并在remote_iov [1]之前完全填充remote_iov [0]。
remote_iov [i] .iov_len和local_iov [i] .iov_len的长度不必相同。 因此,可以将单个本地缓冲区拆分为多个远程缓冲区,反之亦然。
flags参数当前未使用,必须设置为0。
返回值
成功后,process_vm_readv()返回读取的字节数,process_vm_writev()返回写入的字节数。 如果发生部分读/写,则此返回值可能小于请求的字节总数。 调用方应检查返回值以确定是否发生了部分读/写。
错误时,返回-1并正确设置errno。
示例
以下代码示例演示了process_vm_readv()的用法,它从具有PID的进程中读取地址上的19个字节,并将前10个字节写入buf1,并将后10个字节写入buf2。
#include <sys/uio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <errno.h>
#include <iostream>using namespace std;int main(void) {struct iovec local[2];struct iovec remote[1];char buf1[10];char buf2[10];char remote_addr[]={"abc1234567890defABC"};long data_len = strlen(remote_addr);ssize_t nread;pid_t pid = getpid(); //PID of remote process//读remotedata_len个字节,buf1 :10 ; buf2 :10local[0].iov_base = buf1;local[0].iov_len = 10;local[1].iov_base = buf2;local[1].iov_len = 10;remote[0].iov_base = remote_addr;remote[0].iov_len = data_len;nread = process_vm_readv(pid, local, 2, remote, 1, 0);cout<<"cout nread:"<<nread<<endl;fprintf(stderr,"read in CreateProcess %s, Process ID %d \n",strerror(errno),pid);printf("buf1: %s\n",buf1);printf("buf2: %s\n",buf2);}
执行结果:
相关的系统调用还有readv,writev,preadv,pwritev,preadv2,pwrite2
#include <sys/uio.h>ssize_t readv(int fd, const struct iovec *iov, int iovcnt);ssize_t writev(int fd, const struct iovec *iov, int iovcnt);ssize_t preadv(int fd, const struct iovec *iov, int iovcnt,off_t offset);ssize_t pwritev(int fd, const struct iovec *iov, int iovcnt,off_t offset);ssize_t preadv2(int fd, const struct iovec *iov, int iovcnt,off_t offset, int flags);ssize_t pwritev2(int fd, const struct iovec *iov, int iovcnt,off_t offset, int flags);
示例如下:
int main(){char *str0 = "hello ";char *str1 = "world\n";struct iovec iov[2];ssize_t nwritten;iov[0].iov_base = str0;iov[0].iov_len = strlen(str0);iov[1].iov_base = str1;iov[1].iov_len = strlen(str1);nwritten = writev(STDOUT_FILENO, iov, 2);printf("nwritten: %d\n",nwritten);
}
process_vm_readv/writev进程间数据传输相关推荐
- android之aidl进程间通讯数据传输
一.前言 AIDL是Android中IPC(Inter-Process Communication)方式中的一种,AIDL是Android Interface definition language的 ...
- linux进程间通讯-信号
文章目录 进程间通信功能 信号 信号的概念 产生信号的方式 信号的默认(缺省)处理方式 进程接收到信号后的处理方式 kill函数 alarm函数 raise函数 abort函数 pause函数 sig ...
- Android-Binder进程间通讯机制-多图详解
本系列: Android-Binder进程间通讯机制-多图详解 一次Binder通信最大可以传输多大的数据? 关于Binder (AIDL)的 oneway 机制 概述 最近在学习Bin ...
- 进程间基于消息队列的通信_Linux 进程间的通信方式
(一)进程的概念 进程是操作系统的概念,每当我们执行一个程序时,对于操作系统来讲就是创建一个进程,在这个 过程中伴随着资源的分配和释放,可以认为进程是一个程序的一次执行过程. (二)进程间通信的概念 ...
- Linux下不同服务器间数据传输
因为工作原因,需要经常在不同的服务器见进行文件传输,特别是大文件的传输,因此对linux下不同服务器间数据传输命令和工具进行了研究和总结.主要是rcp,scp,rsync,ftp,sftp,lftp, ...
- 管道实现进程间通讯 、WaitNamedPipe
一.管道实现进程间通讯 主要的理论知识 1.什么是管道以及分类 管道是两个头的东西,每一个头各连接一个进程或者同一个进程的不同代码,依照管道的类别分有两种管道,匿名的和命名的:依照管道的传输方向分也能 ...
- linux下不同服务器间数据传输(rcp,scp,rsync,ftp,sftp,lftp,wget,curl)
因为工作原因,需要经常在不同的服务器见进行文件传输,特别是大文件的传输,因此对linux下不同服务器间数据传输命令和工具进行了研究和总结.主要是rcp,scp,rsync,ftp,sftp,lftp, ...
- 进程间的通讯(IPC)方式
内存映射 为什么要进行进程间的通讯(IPC (Inter-process communication)) 数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几M字节之间 共享数 ...
- Linux 进程 | 进程间的通信方式
文章目录 管道 匿名管道 pipe 命名管道 FIFO 共享内存 共享内存的使用流程: 消息队列 信号量 套接字 在之前的博客中讲过,虚拟空间出现的其中一个目的就是解决 进程没有独立性,可能访问同一块 ...
最新文章
- 布局文件中fill_parent、match_parent和wrap_content有什么区别?
- 一天一个设计模式(一) - 总体概述
- php使用pdf2htmlex,转换 HTML 与 PDF 格式文档的神器
- ES6之Module 的加载实现(3)
- 联想服务器重装2008,联想ThinkSystem机器安装2008R2详细教程
- 车辆动力学及控制_第一届国际轮胎动力学仿真技术峰会在长春举行
- OpenShift Security (9) - 用 RHACS 扫描 Log4j 安全漏洞,屏蔽不安全镜像部署
- 【报告分享】2020年她趋势报告.pdf(附下载链接)
- 简要概述网络I/O与并发
- REC Solar推出黑色多晶半切片PERC组件,已进入量产化
- matlab中gain是什么,PID调理中的GAIN是啥意思?
- matlab pt站下载,PT站RSS下载使用教程 | PT邀请码网
- 腾讯云学生机官网地址在哪里?
- matlab 中图的大小_关于matlab绘图中字体及图片大小等的设置
- 数据北京研发中心CTO王东:如何打造有战斗力的团队
- 苹果iPad2充不上电的问题
- 国开电大大学计算机应用基础 (专科)终结性考试试题以及答案(大作业)所有答案和PPT已经做好,直接填写名字学号即可,详情可以看缩略图。
- 蓝桥杯刷题冲刺 | 倒计时20天
- 星诺奇科技IPO被终止:曾拟募资3.5亿元 年营收3.67亿
- 美容行业小程序的特点
热门文章
- 制造业行业现状及智能生产管理系统一体化解决方案
- 【无标题】三. 流程控制
- 2019年4月22日A股暴跌行情思考
- 挖掘行业长尾关键字以及词库的步骤
- 解决联想笔记本电脑经常突然休眠的问题
- python安装虚拟环境没有activate_python安装虚拟环境
- “三网融合”的过去、现在与未来
- kafka、zookeeper正常启动,创建topic:报错Replication factor: 3 larger than available brokers: 0
- SQL2005,错误 0xc00470fe 数据流任务 产品级别对于 组件“源 - 2009_txt”(1) 而言不足
- 华为路由器查看DHCP地址池ip使用状态