- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我只是想使用 readv() 从文件中获取一些数据。但是总是打印垃圾字符。我试图为 iovec.iov_base 分配空间,但没有运气。我什至想到了为什么要使用 readv 函数而不是坚持使用更简单和可读性更高的 read 函数。我现在很困惑,不知道需要 readv 和 writev 函数。
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<unistd.h>
#include<fcntl.h>
#include<string.h>
#include<errno.h>
#include<sys/uio.h>
#include<sys/types.h>
#include<sys/stat.h>
#define MAX 50000
int main()
{
struct iovec data[2];
int i=0,fd;
for(i=0; i<3 ; i++ ) {
data[i].iov_len=MAX;
data[i].iov_base=(char*) malloc(MAX); //if this line is in comment, segmentation fault will occur.
/* data[i].iov_base=(char*) malloc(0); //This is also working ?*/
}
fd=open("/tmp/test",O_RDWR);
if(fd==-1){
printf("can't open the input file\n");
return 1;
}
readv(fd,data,3);
for(i=0; i<2 ; i++ ) {
printf("((%s))\n",(char*)data[i].iov_base);
}
}
提前谢谢你。
最佳答案
您使用 POSIX readv()
和 writev()
函数('scatter read' 和 'gather write' — 另见 Wikipedia on Vectored I/O )当您使用文件描述符并且需要将读取分组到不同(非连续)内存位置的集合或从中写入但您想要通过单个函数调用完成读取或写入。
例如,我有一个程序需要记录一些控制数据和一些二进制数据的十六进制转储,但它想确保其写入是原子的。所以,我有这样的功能:
static void log_message(int log_fd, const char *elapsed, const char *tag, const char *buffer, ssize_t nbytes)
{
char hdrbuff[64];
struct iovec vector[3];
const char *data = format_image(buffer, nbytes);
snprintf(hdrbuff, sizeof(hdrbuff), "%s %s %6ld\n", elapsed, tag, (long)nbytes);
vector[0].iov_base = hdrbuff;
vector[0].iov_len = strlen(hdrbuff);
vector[1].iov_base = CONST_CAST(char *, data);
vector[1].iov_len = strlen(data);
vector[2].iov_base = "\n";
vector[2].iov_len = 1;
if (writev(log_fd, vector, 3) <= 0)
err_syserr("Failed to write log entry (%s: %ld)\n", tag, (long)nbytes);
}
需要写换行符有点麻烦,但是 format_image()
函数不能添加杂散的换行符。 (它是在别处使用的库函数,如果它添加额外的换行符,其他用途就会被破坏。)但是,writev()
允许我在不更改库函数的情况下编写所有内容,并最大化文件上不会有任何交错的机会。 (在上下文中,有第二个进程使用相同的日志文件和相同的打开文件描述,但协议(protocol)是半双工的,因此临时重叠的可能性很小。但是,使用分散/聚集 I/O 将机会最小化的问题。)
我没有记得使用 readv()
的示例,但是当您知道有多个固定大小的数据 block 要读入非连续的内存位置。
关于c - readv和writev的工作流程。使用 readv 和 writev 而不是使用 read 和 write 的所有优点是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49188413/
这是man writev说: The data transfers performed by readv() and writev() are atomic: the data written by
我正在研究 writev 和 readv,当我显示内存内容时,我得到了奇怪的数据: struct iovec *iov = malloc(sizeof(struct iovec) * 3); iov[
我尝试将 writev 与 direct IO 结合起来。但是当我和他们结合时,我失败了。 下面的代码有效,但如果我在 open() 时添加 O_DIRECT 则失败 失败时我总是得到“无效参数”。
#include #include #include #include int main(int argc, char *argv[]) { int fd; fd=open(a
我已经阅读了 writev 的手册页并发现 ERRORS 部分指出 EINVAL ... the vector count iovcnt is less than zero or greater th
假设我通过TCP套接字连接到客户端,并在套接字上调用writev并包含3个项目,说“从地址A写入16个字节,从地址B写入32个字节,再从地址A写入16个字节”。 是将完整的64字节消息组装在我的机器的
希望你能帮帮我。 我正在尝试通过 TCP/IP 通过网络发送 1000 位的数据包,我希望也能够在 Cygwin 和 Windows 中使用重叠 I/O 技术。 在 Cygwin 中,我尝试使用“re
我有很多 send(fd, buf, len, MSG_DONTWAIT | MSG_NOSIGNAL) 我想合并成一个 writev(fd, iov, iovcnt) 但是,writev 无法识别
writev 函数接受一个 struct iovec 数组作为输入参数 writev(int fd, const struct iovec *iov, int iovcnt); 输入是需要写入文件(比
我在 Docker 容器中为我的项目使用 React、React-Redux 和 Webpack,但一直遇到这个错误 internal/stream_base_commons.js:59 var er
是否有适用于 char * bufs 而不是文件描述符的 readv/writev 等效项? 例如,如果我有一个 char * buf[] 数组,并且我想将其全部复制到一个 char buf * 中。
有一个multiplayer card game我首先在 C 中将其编程为非 fork 套接字服务器(使用 poll() 调用)。 然后添加新功能对我来说太困难了,我已经切换到 Perl(使用 IO:
我正在运行旧的 Angular 应用程序:[angular/cli-1.4.5,node:10.13.0 and windows: win32 x64]。当我为我的应用程序提供服务时,它编译成功,但是
在 scatter 和 gather(即 readv 和 writev)中,Linux 读取多个缓冲区并从多个缓冲区。 如果说,我有一个包含 3 个缓冲区的向量,我可以使用 readv,或者我可以使用
我只是想使用 readv() 从文件中获取一些数据。但是总是打印垃圾字符。我试图为 iovec.iov_base 分配空间,但没有运气。我什至想到了为什么要使用 readv 函数而不是坚持使用更简单和
我有一个与 USB 交互的程序,我想知道以下写入命令告诉我什么。我知道 writev iovec 结构由数据数组指针和长度组成,但是 "@\10\335\320\2w\4\240K\252\0\7"
我是一名优秀的程序员,十分优秀!