- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在尝试在 Linux 2.6.32 下测试 sendfile()
系统调用以在两个常规文件之间进行零拷贝数据。据我了解,它应该可以工作:从 2.6.22 开始,sendfile()
已使用 splice()
实现,并且输入文件和输出文件可以是常规文件或套接字。
sendfile_test.c
内容如下:
#include <sys/sendfile.h>
#include <fcntl.h>
#include <stdio.h>
int main(int argc, char **argv) {
int result;
int in_file;
int out_file;
in_file = open(argv[1], O_RDONLY);
out_file = open(argv[2], O_WRONLY | O_CREAT | O_TRUNC, 0644);
result = sendfile(out_file, in_file, NULL, 1);
if (result == -1)
perror("sendfile");
close(in_file);
close(out_file);
return 0;
}
当我运行以下命令时:
$ gcc sendfile_test.c
$ ./a.out infile outfile
输出是
sendfile: Invalid argument
运行时
$ strace ./a.out infile outfile
输出包含
open("infile", O_RDONLY) = 3
open("outfile", O_WRONLY|O_CREAT|O_TRUNC, 0644) = 4
sendfile(4, 3, NULL, 1) = -1 EINVAL (Invalid argument)
我做错了什么?
最佳答案
您忘记检查 argc
是否等于 3
,即您打开名称为 argv[2]
的输出文件,但是只给你的程序一个参数(并且你不会在 open(2)
之后检查错误。)
您可以使用 strace(1)
找出哪个系统调用失败。
这对我来说看起来像是旧内核。相同的源代码(模数错误检查)在 2.6.33.4 #3 SMP
下工作正常。另外,您只复制一个字节有什么特别的原因吗?
#include <sys/sendfile.h>
#include <err.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main( int argc, char *argv[] )
{
int in_file, out_file;
if ( argc != 3 )
{
fprintf( stderr, "usage: %s <in-file> <out-file>\n", argv[0] );
exit( 1 );
}
if (( in_file = open( argv[1], O_RDONLY )) == -1 ) err( 1, "open" );
if (( out_file = open( argv[2], O_WRONLY | O_CREAT | O_TRUNC, 0644 )) == -1 )
err( 1, "open(2)" );
if ( sendfile( out_file, in_file, NULL, 4096 ) == -1 ) err( 1, "sendfile" );
exit( 0 );
}
跟踪:
nickf@slack:~/csource/linux/splice$ cc -Wall -pedantic -ggdb -g3 -o sf sndf.c
nickf@slack:~/csource/linux/splice$ strace ./sf Makefile mm
...
open("Makefile", O_RDONLY) = 3
open("mm", O_WRONLY|O_CREAT|O_TRUNC, 0644) = 4
sendfile(4, 3, NULL, 4096) = 239
exit_group(0) = ?
nickf@slack:~/csource/linux/splice$ diff Makefile mm
nickf@slack:~/csource/linux/splice$
关于c - 带有两个常规文件的 sendfile() 中的参数无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2945372/
在我的 router/index.js 中,我使用 res.sendfile(..) 如下: var express = require('express'); var router = expres
设置路径的正确方法是什么? 在我的应用程序中,我使用此代码设置发送文件的路径。 app.get('/',function(req, res){//get,put,post,delete res
在我的程序中,我需要检查非阻塞套接字中 sendfile() 操作的完成情况。怎么办? 查了资料,上网查了下,没找到方法 最佳答案 它的工作方式与 send() 非常相似:如果套接字设置为 O_NON
这是我的客户端代码片段: while(((uint32_t)total_bytes_read != fsize) && ((nread = read(sockd, filebuffer, sizeof
这是 LIST ftp 的 cmd 的片段: count = file_list("./", &files); if((fp_list = fopen("listfiles.txt", "w")) =
我正在尝试重新发送一个 Json 文件,但是当我这样做时,它会不断返回许多特殊字符,如下所示: book����mark����8���8���`Q�����������eǾJu¼A����rs/f
我创建文件 1.txt 2.txt 并将一些内容写入 1.txt。 然后我使用下面的代码,想把内容复制到2.txt. 但它不起作用。 2.txt 中没有任何内容。 你能解释一下我的错误吗? int m
我正在尝试实现一个基本的文件服务器。我一直在尝试使用此处的 sendfile 命令:http://linux.die.net/man/2/sendfile我正在使用 TCP。 我可以让它正常发送,但它
我正在使用Wildcard Subdomains在我的 Express 服务器上,这样当用户访问 name.example.com 或从该子域的 API 请求某些内容时,一切都会正常工作。 (导航到
使用res.sendFile()时,响应中不会收到set-cookie header 。 app.get(sessionTracker, (req, res, next) => { res.coo
前奏 sendfile() 是一个非常有用的系统调用,原因有两个: 首先,它比 read()/write() (或 recv())代码更少/send()(如果您更喜欢 jive)循环。 其次,它比上述
服务器端 我尝试从 NodeJs 发送文件 /** * Exports data to PDF format route. */ app.post('/export/pdf', upload.si
我正在尝试使用 Linux 系统调用 sendfile() 来使用线程复制文件。 我有兴趣优化代码的这些部分: fseek(fin, size * (number) / MAX_THREADS, SE
作为服务器,我想从非阻塞客户端套接字读取数据,然后写入文件。 根据 sendfile 的手册页,如果 errno 设置为 EAGAIN,那么这仅表明,如果 output 文件描述符设置为非阻塞,则对
我正在尝试向客户端发送静态 html。 我使用这种方法成功地做到了这一点 app.get('/forgot', function (req, res) { console.log("F
我的/blog 和/post 在浏览器控制台中触发了许多 404 未找到错误,可以在 here 中找到这些错误即使 blog.html 和 post.html 如果我从文件资源管理器打开它都可以工作!
我正在做一个 Node 项目,在其中公开我的公共(public)文件夹,例如: app.use(express.static(path.join(__dirname, '/public'))) 现在,
我正在尝试使用 sendfile() 来实现一个复制程序。 但是当我尝试复制目录时它失败了。目录在 Linux 中不是一种特殊的文件类型吗? 这是我现在使用的代码。它是从 StackOverflow
假设我的 Express.js 应用程序中有这个路由处理程序: app.get('/files/:name', function (req, res) { res.sendfile('path
我正在尝试在 Linux 2.6.32 下测试 sendfile() 系统调用以在两个常规文件之间进行零拷贝数据。据我了解,它应该可以工作:从 2.6.22 开始,sendfile() 已使用 spl
我是一名优秀的程序员,十分优秀!