使用 c99 在 Linux 上截断文件

Truncate file on Linux with c99

我想打开一个文件并设置它的大小,以便我可以使用 mmap 写入它。

我发现我可以使用函数 truncateftruncate。不幸的是,当我包含 <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>