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进程间数据传输相关推荐

  1. android之aidl进程间通讯数据传输

    一.前言 AIDL是Android中IPC(Inter-Process Communication)方式中的一种,AIDL是Android Interface definition language的 ...

  2. linux进程间通讯-信号

    文章目录 进程间通信功能 信号 信号的概念 产生信号的方式 信号的默认(缺省)处理方式 进程接收到信号后的处理方式 kill函数 alarm函数 raise函数 abort函数 pause函数 sig ...

  3. Android-Binder进程间通讯机制-多图详解

    本系列: Android-Binder进程间通讯机制-多图详解 一次Binder通信最大可以传输多大的数据?​​​​​​​ 关于Binder (AIDL)的 oneway 机制 概述 最近在学习Bin ...

  4. 进程间基于消息队列的通信_Linux 进程间的通信方式

    (一)进程的概念 进程是操作系统的概念,每当我们执行一个程序时,对于操作系统来讲就是创建一个进程,在这个 过程中伴随着资源的分配和释放,可以认为进程是一个程序的一次执行过程. (二)进程间通信的概念 ...

  5. Linux下不同服务器间数据传输

    因为工作原因,需要经常在不同的服务器见进行文件传输,特别是大文件的传输,因此对linux下不同服务器间数据传输命令和工具进行了研究和总结.主要是rcp,scp,rsync,ftp,sftp,lftp, ...

  6. 管道实现进程间通讯 、WaitNamedPipe

    一.管道实现进程间通讯 主要的理论知识 1.什么是管道以及分类 管道是两个头的东西,每一个头各连接一个进程或者同一个进程的不同代码,依照管道的类别分有两种管道,匿名的和命名的:依照管道的传输方向分也能 ...

  7. linux下不同服务器间数据传输(rcp,scp,rsync,ftp,sftp,lftp,wget,curl)

    因为工作原因,需要经常在不同的服务器见进行文件传输,特别是大文件的传输,因此对linux下不同服务器间数据传输命令和工具进行了研究和总结.主要是rcp,scp,rsync,ftp,sftp,lftp, ...

  8. 进程间的通讯(IPC)方式

    内存映射 为什么要进行进程间的通讯(IPC (Inter-process communication)) 数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几M字节之间 共享数 ...

  9. Linux 进程 | 进程间的通信方式

    文章目录 管道 匿名管道 pipe 命名管道 FIFO 共享内存 共享内存的使用流程: 消息队列 信号量 套接字 在之前的博客中讲过,虚拟空间出现的其中一个目的就是解决 进程没有独立性,可能访问同一块 ...

最新文章

  1. 布局文件中fill_parent、match_parent和wrap_content有什么区别?
  2. 一天一个设计模式(一) - 总体概述
  3. php使用pdf2htmlex,转换 HTML 与 PDF 格式文档的神器
  4. ES6之Module 的加载实现(3)
  5. 联想服务器重装2008,联想ThinkSystem机器安装2008R2详细教程
  6. 车辆动力学及控制_第一届国际轮胎动力学仿真技术峰会在长春举行
  7. OpenShift Security (9) - 用 RHACS 扫描 Log4j 安全漏洞,屏蔽不安全镜像部署
  8. 【报告分享】2020年她趋势报告.pdf(附下载链接)
  9. 简要概述网络I/O与并发
  10. REC Solar推出黑色多晶半切片PERC组件,已进入量产化
  11. matlab中gain是什么,PID调理中的GAIN是啥意思?
  12. matlab pt站下载,PT站RSS下载使用教程 | PT邀请码网
  13. 腾讯云学生机官网地址在哪里?
  14. matlab 中图的大小_关于matlab绘图中字体及图片大小等的设置
  15. 数据北京研发中心CTO王东:如何打造有战斗力的团队
  16. 苹果iPad2充不上电的问题
  17. 国开电大大学计算机应用基础 (专科)终结性考试试题以及答案(大作业)所有答案和PPT已经做好,直接填写名字学号即可,详情可以看缩略图。
  18. 蓝桥杯刷题冲刺 | 倒计时20天
  19. 星诺奇科技IPO被终止:曾拟募资3.5亿元 年营收3.67亿
  20. 美容行业小程序的特点

热门文章

  1. 制造业行业现状及智能生产管理系统一体化解决方案
  2. 【无标题】三. 流程控制
  3. 2019年4月22日A股暴跌行情思考
  4. 挖掘行业长尾关键字以及词库的步骤
  5. 解决联想笔记本电脑经常突然休眠的问题
  6. python安装虚拟环境没有activate_python安装虚拟环境
  7. “三网融合”的过去、现在与未来
  8. kafka、zookeeper正常启动,创建topic:报错Replication factor: 3 larger than available brokers: 0
  9. SQL2005,错误 0xc00470fe 数据流任务 产品级别对于 组件“源 - 2009_txt”(1) 而言不足
  10. 华为路由器查看DHCP地址池ip使用状态