使用 c99 在 Linux 上截断文件
Truncate file on Linux with c99
我想打开一个文件并设置它的大小,以便我可以使用 mmap 写入它。
我发现我可以使用函数 truncate
或 ftruncate
。不幸的是,当我包含 <unistd.h>
时出现错误:
error: implicit declaration of function ‘truncate’
我在网上看到我应该使用 gnu 或类似的东西,但这是针对学校项目的,我们必须使用 -std=c99
进行编译。
还有其他选择吗?
当您使用 -std=c99
时,C 库确保 headers 不声明任何 reserved/are 未在 C 标准库中定义的符号。由于 ftruncate
不属于 C 标准库,而是 POSIX 扩展,默认情况下未定义。
POSIX 程序在包含 headers.
之前必须具有适当的值,以获得最大兼容性 define the _POSIX_C_SOURCE
feature test macro 或 _XOPEN_SOURCE
功能测试宏在 Linux 手册页等示例中很方便地列出;对于 ftruncate
这些将是:
ftruncate():
_XOPEN_SOURCE >= 500
|| /* Since glibc 2.3.5: */ _POSIX_C_SOURCE >= 200112L
|| /* Glibc versions <= 2.19: */ _BSD_SOURCE
即使用
#define _XOPEN_SOURCE 500 // (or greater; current is 700)
#include <unistd.h>
或
#define _POSIX_C_SOURCE 200112L // (or greater)
#include <unistd.h>
我想打开一个文件并设置它的大小,以便我可以使用 mmap 写入它。
我发现我可以使用函数 truncate
或 ftruncate
。不幸的是,当我包含 <unistd.h>
时出现错误:
error: implicit declaration of function ‘truncate’
我在网上看到我应该使用 gnu 或类似的东西,但这是针对学校项目的,我们必须使用 -std=c99
进行编译。
还有其他选择吗?
当您使用 -std=c99
时,C 库确保 headers 不声明任何 reserved/are 未在 C 标准库中定义的符号。由于 ftruncate
不属于 C 标准库,而是 POSIX 扩展,默认情况下未定义。
POSIX 程序在包含 headers.
之前必须具有适当的值,以获得最大兼容性 define the_POSIX_C_SOURCE
feature test macro 或 _XOPEN_SOURCE
功能测试宏在 Linux 手册页等示例中很方便地列出;对于 ftruncate
这些将是:
ftruncate():
_XOPEN_SOURCE >= 500
|| /* Since glibc 2.3.5: */ _POSIX_C_SOURCE >= 200112L
|| /* Glibc versions <= 2.19: */ _BSD_SOURCE
即使用
#define _XOPEN_SOURCE 500 // (or greater; current is 700)
#include <unistd.h>
或
#define _POSIX_C_SOURCE 200112L // (or greater)
#include <unistd.h>