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

sendfile不适用于空stdin
EN

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

非空stdin的strace输出:

代码语言:javascript
运行
复制
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
运行
复制
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 13:19:34

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

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

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

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

代码语言:javascript
运行
复制
#include 
#include 

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

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

代码语言:javascript
运行
复制
$ ./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

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档