sys/sendfile.h 未找到 GCC

问题描述 投票:0回答:5

我使用的是 Mac OS 10.6.7,

我买Mac的时候gcc编译器就已经有了。 但是当我尝试包含 sys/sendfile.h 时

#include<sys/sendfile.h>

它抛出一个错误

sys/sendfile.h: No such file or directory.

但是这个程序在ubuntu GCC编译器中可以正常工作。知道如何解决这个问题吗?

c++ c networking gcc osx-snow-leopard
5个回答
7
投票

sendfile() 最终是一种内核功能,而不是库或编译器,引用 linux 手册页,“其他 Unix 系统以不同的语义和原型实现 sendfile()。它不应该在可移植程序中使用。”

这里曾经有一个指向适用的 OSX/Darwin 手册页的 sendfile 的链接,但 Apple 不断移动他们的文档,因此您必须自己找到它。

Linux 手册页警告确实是准确的 - 原型不同:

OSX:

int sendfile(int fd, int s, off_t offset, off_t *len, struct sf_hdtr *hdtr, int flags);

Linux:

ssize_t sendfile(int out_fd, int in_fd, off_t *offset, size_t count);

所以你需要重写一些东西。

osx 包含在该手册页上,但为了完整性:

#include <sys/types.h>
#include <sys/socket.h>
#include <sys/uio.h>

6
投票

根据Linux手册页

POSIX.1-2001 或其他标准中未指定。

其他 UNIX 系统以不同的语义和原型实现 sendfile()。它不应该在便携式程序中使用。

我不确定 OSX,但似乎你必须自己挖掘一下才能找到它。


4
投票

您在寻找

sendfile(2)
吗?如果是这样,它不在
sys/sendfile.h

OS X 开发者库指出您应该包含这些:

 #include <sys/types.h>
 #include <sys/socket.h>
 #include <sys/uio.h>

2
投票

在 OSX 上,sendfile 在 socket.h 中定义。所以你需要包含socket.h而不是sys/sendfile.h


0
投票

sendfile() 函数在 OSX 上不受支持,但在其他 Linux 发行版(如 Ubuntu 等)上可用。出现这种区别是因为 sendfile() 是一种内核功能,而不是特定于库或编译器。因此,在 OSX 上,您必须使用 OSX 版本的函数

但是,需要注意的是,与 Linux 版本相比,OSX 版本的 sendfile() 需要更多参数如果您在 OSX 环境中错误地使用 Linux 版本的 sendfile(),您将遇到名为“函数 sendfile 的参数太少”的编译错误。这是因为 Linux 版本只需要四个参数,而 OSX 版本需要六个。

要解决此问题,请确保针对相应操作系统使用正确版本的 sendfile()。如果您使用的是 OSX,请确保提供所需的六个参数。或者,您可以在 Linux 环境中或通过 Docker 文件运行代码,因为 Linux 版本的 sendfile 的兼容性问题较少。

© www.soinside.com 2019 - 2024. All rights reserved.