首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >sendfile不适用于空stdin

sendfile不适用于空stdin
EN

Unix & Linux用户
提问于 2019-11-03 07:54:37
回答 1查看 237关注 0票数 3

非空stdin的strace输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
execve("./cat", ["./cat"], 0x7fff610af090 /* 37 vars */) = 0
sendfile(1, 0, NULL, 1048576)           = 4
sendfile(1, 0, NULL, 1048576)           = 0
close(0)                                = 0
exit(0)                                 = ?
+++ exited with 0 +++

空stdin的strace输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
execve("./cat", ["./cat"], 0x7fff610af090 /* 37 vars */) = 0
sendfile(1, 0, NULL, 1048576)           = -1 EINVAL (Invalid argument)
sendfile(1, 0, NULL, 1048576)           = -1 EINVAL (Invalid argument)
sendfile(1, 0, NULL, 1048576)           = -1 EINVAL (Invalid argument)
sendfile(1, 0, NULL, 1048576)           = -1 EINVAL (Invalid argument)
sendfile(1, 0, NULL, 1048576)           = -1 EINVAL (Invalid argument)
sendfile(1, 0, NULL, 1048576)           = -1 EINVAL (Invalid argument)
sendfile(1, 0, NULL, 1048576)           = -1 EINVAL (Invalid argument)
sendfile(1, 0, NULL, 1048576)           = -1 EINVAL (Invalid argument)
sendfile(1, 0, NULL, 1048576)           = -1 EINVAL (Invalid argument)
sendfile(1, 0, NULL, 1048576)           = -1 EINVAL (Invalid argument)
sendfile(1, 0, NULL, 1048576)           = -1 EINVAL (Invalid argument)
sendfile(1, 0, NULL, 1048576)           = -1 EINVAL (Invalid argument)
...

uname -a:5.3.8-arch1-1 #1 SMP PREEMPT @1572357769 x86_64 GNU/Linux

EN

回答 1

Unix & Linux用户

发布于 2022-11-27 05:19:34

这似乎是sendfile调用的预期行为。让我引用Linus Torvalds的例子:

sendfile()仅适用于使用页面缓存的东西。EINVAL基本上是sendfile的一种说法:“我会回到做read+write,所以您最好自己在用户空间中做,因为这样可能会更有效”。(https://yarchive.net/comp/linux/sendfile.html)

因此,只有当内核知道sendfile实际上是一个文件,而不是管道、阻塞设备或其他任何东西时,stdin才能使用stdin

我自己写了一个简单的程序来检查它:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include 
#include 

int main() {
    sendfile(fileno(stdout), fileno(stdin), NULL, 8);
    perror("sendfile failed");
}

使用各种重定向运行它可以清楚地表明,只有当输入直接绑定到常规文件(空或非)时,sendfile调用才是成功的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ ./sendfile-test
sendfile failed: Invalid argument

$ ./sendfile-test < empty.txt
sendfile failed: Success

$ ./sendfile-test < non-empty.txt
(...)
sendfile failed: Success

$ ./sendfile-test < /dev/null
sendfile failed: Invalid argument

$ cat empty.txt | ./sendfile-test
sendfile failed: Invalid argument

$ cat non-empty.txt | ./sendfile-test
sendfile failed: Invalid argument

$ cat /dev/null | ./sendfile-test
sendfile failed: Invalid argument
票数 0
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/550149

复制
相关文章
环境复制不适用于微服务
什么是验证代码是否能够工作的最佳方式?当我与能力强大的平台工程师和运维架构师交谈时,有一个迷人的趋势是,没有人似乎能就测试应该在哪里或如何进行达成一致。
云云众生s
2024/03/27
840
C语言缓冲区之 gets(str);fflush(stdin); rewind(stdin);setbuf(stdin, NULL);
清空键盘缓冲区很多种方法,如用fflush(stdin); rewind(stdin);setbuf(stdin, NULL);前两者仅对windows有用,最后一个则对Linux系统也适用。那么为什么需要清空键盘缓冲区呢? 以下几个实例:
瑞新
2020/07/07
2.8K0
sendfile函数–零拷贝
零拷贝:零拷贝技术可以减少数据拷贝和共享总线操作的次数,消除通信数据在存储器之间不必要的中间拷贝过程,有效地提高通信效率,是设计高速接口通道、实现高速服务器和路由器的关键技术之一。 sendfile
全栈程序员站长
2022/09/01
8610
为什么演练测试不适用于微服务测试
想象一下:你是一家中等规模工程团队的开发人员。你刚刚完成了一个很棒的新功能的编码。你很兴奋地将其部署到演练环境进行测试。但是等等...这是什么?演练环境又坏了。
云云众生s
2024/08/20
730
为什么演练测试不适用于微服务测试
为什么环境复制不适用于微服务测试
沙箱包含一个单一的、类似生产的预生产环境,它结合了隔离测试的优势和共享设置的效率。
云云众生s
2024/09/30
690
为什么环境复制不适用于微服务测试
PCA不适用于时间序列分析的案例研究
在大部份情况下我们都可以使用 PCA 进行线性降维。从图像处理到非结构化数据,无时无刻不在。我们甚至可以将它用于时间序列分析,虽然有更好的技术。在这篇文章中,我想向您介绍动态模式分解 (DMD),这是一种源自我的研究领域:流体动力学的用于高维时间序列的线性降维技术。DMD 结合了两个世界中的优点:PCA 和傅立叶变换。在数学上,它与动力系统理论中的一个基本算子有关,称为 Koopman 算子。但在深入研究 DMD 的数学之前,让我们用一个相当简单的例子来说明为什么 PCA 不是高维时间序列分析的最佳选择。
deephub
2021/07/23
1.5K0
PCA不适用于时间序列分析的案例研究
Python和sendfile[通俗易懂]
sendfile(2) is a UNIX system call which provides a “zero-copy” way of copying data from one file descriptor (a file) to another (a socket). Because this copying is done entirely within the kernel, sendfile(2) is more efficient than the combination of “file.read()” and “socket.send()”, which requires transferring data to and from user space. This copying of the data twice imposes some performance and resource penalties which sendfile(2) syscall avoids; it also results in a single system call (and thus only one context switch), rather than the series of read(2) / write(2) system calls (each system call requiring a context switch) used internally for the data copying. A more exhaustive explanation of how sendfile(2) works is available here, but long story short is that sending a file with sendfile() is usually twice as fast than using plain socket.send(). Typical applications which can benefit from using sendfile() are FTP and HTTP servers.
全栈程序员站长
2022/08/18
8270
sendfile函数「建议收藏」
sendfile函数在两个文件描述符之间直接传递数据(完全在内核中操作),从而避免了内核缓冲区和用户缓冲区之间的数据拷贝,效率很高,这被称为零拷贝。sendfile函数的定义如下:
全栈程序员站长
2022/08/18
5210
tp5如何创建空对象(用于接口返回json空对象)
{ “code”: 1, “msg”: “成功”, “time”: “1660123209”, “data”: {}, }
超级小可爱
2023/02/20
4.2K0
Linux | 从 STDIN 读取 Awk 输入
在之前关于 Awk 工具的系列文章中,主要探讨了如何从文件中读取数据。但如果你希望从标准输入(STDIN)中读取数据,又该如何操作呢?
数据科学工厂
2024/04/15
1400
Linux | 从 STDIN 读取 Awk 输入
安卓HttpPost不适用于Python CGI服务器
我在Android开发过程中,积累的心得和最佳实践可以极大地提高开发效率和应用质量。首先要深入理解Activity和Fragment的生命周期。这对于管理应用的状态和避免内存泄漏至关重要。避免在主线程执行长时间运行的操作,使用异步处理机制,如AsyncTask或Kotlin协程。下文将是我开发时候遇到得问题总结以及解决方案一一作了详细说明。
华科云商小徐
2024/01/23
1570
4、sendfile(零拷贝技术)
Get
2024/03/10
3390
stdin and stdout which it's ?
最近写了几个C函数,来处理项目中一个Desktop跨应用的进程通信,被32-bit,LE(BE)折磨了很久,stdin and stdout 看起来是一个很简单的标准输入输出,但是处理的过程中,却遇到了很大的障碍,因为历史问题,一个bytes的长度,需要将消息的位置移动4个byte存储消息的长度,先发送给对方,告诉对方我即将发送一个多少长度的byte,反之解析也是亦然。
icepy
2019/06/24
9880
stdin and stdout which it's ?
sendfile()对Nginx性能的提升
Linux kernel 2.2之前,(如图)读写数据基本都是使用read系统调用和write系调用,以nginx来说如果一个请求建立,从磁盘的文件到网络连接之间会通过硬件(DMA)---内核层---用户层多次读写系统来完成文件数据的复制传输:从内核层用read系统调用读到用户层,再从用户层用write系统调用写到内核层,每一次用户层到内核层的进行一次上下文转换,这种代价是非常昂贵的。甚至在没有数据变化时这种复制尤其显得多余。如果nginx接受大量并发请求,这种系统调用就会非常频繁,服务器的性能就会下降。
星哥玩云
2022/07/01
5350
sendfile()对Nginx性能的提升
初探sendfile「建议收藏」
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/134831.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/06
3960
Nginx sendfile原理详解[通俗易懂]
sendfile系统调用在两个文件描述符之间直接传递数据(完全在内核中操作),从而避免了数据在内核缓冲区和用户缓冲区之间的拷贝,操作效率很高,被称之为零拷贝。
全栈程序员站长
2022/08/29
8620
Nginx sendfile原理详解[通俗易懂]
Linux gzip: stdin: not in gzip format
在解压tar.gz文件的时候报错 tar -zxvf otp_src_18.3.tar.gz gzip: stdin: not in gzip format tar: Child returned
Arebirth
2020/06/19
3.1K0
php案例:STDIN的使用
STDIN 是一个预定义常量,用于在PHP中读取标准输入流。它通常用于从控制台或命令行中获取用户输入。
贵哥的编程之路
2024/01/18
1740
php案例:STDIN的使用
观察者模式observer不适用于_观察者模式代码
在软件构建过程中,我们需要为某些对象建立 一种“通知依赖关系” —-一个对象发(目标对象)的状态发生改变,所有依赖的对象(观察者对象)都将很好的得到通知。如果这样的依赖关系过于紧密。将使软件不能很好的抵御变化
全栈程序员站长
2022/09/22
6270
零拷贝技术 与 sendfile
可以看到,整个数据的传输过程,都要需要 CPU 亲自参与搬运数据的过程,而且这个过程,CPU 是不能做其他事情的。
看、未来
2021/10/18
1.1K0

相似问题

为什么这个函数不适用于吸收stdin?

20

Linux讨厌: /dev/stdin不适用于套接字

10

如果stdin为空,则运行命令

30

函数调用,如果为空,则为stdin或/dev/null

10

检查是否没有命令行参数且STDIN为空

40
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文