NAME |LIBRARY |SYNOPSIS |DESCRIPTION |RETURN VALUE |ERRORS |VERSIONS |STANDARDS |HISTORY |NOTES |BUGS |SEE ALSO |COLOPHON | |
truncate(2) System Calls Manualtruncate(2)truncate, ftruncate - truncate a file to a specified length
Standard C library (libc,-lc)
#include <unistd.h>int truncate(const char *path, off_tlength);int ftruncate(intfd, off_tlength); Feature Test Macro Requirements for glibc (seefeature_test_macros(7)):truncate(): _XOPEN_SOURCE >= 500 || /* Since glibc 2.12: */ _POSIX_C_SOURCE >= 200809L || /* glibc <= 2.19: */ _BSD_SOURCEftruncate(): _XOPEN_SOURCE >= 500 || /* Since glibc 2.3.5: */ _POSIX_C_SOURCE >= 200112L || /* glibc <= 2.19: */ _BSD_SOURCE
Thetruncate() andftruncate() functions cause the regular file named bypath or referenced byfd to be truncated to a size of preciselylength bytes. If the file previously was larger than this size, the extra data is lost. If the file previously was shorter, it is extended, and the extended part reads as null bytes ('\0'). The file offset is not changed. If the size changed, then the st_ctime and st_mtime fields (respectively, time of last status change and time of last modification; seeinode(7)) for the file are updated, and the set- user-ID and set-group-ID mode bits may be cleared. Withftruncate(), the file must be open for writing; withtruncate(), the file must be writable.On success, zero is returned. On error, -1 is returned, anderrno is set to indicate the error.
Fortruncate():EACCESSearch permission is denied for a component of the path prefix, or the named file is not writable by the user. (See alsopath_resolution(7).)EFAULTThe argumentpath points outside the process's allocated address space.EFBIGThe argumentlength is larger than the maximum file size. (XSI)EINTRWhile blocked waiting to complete, the call was interrupted by a signal handler; seefcntl(2) andsignal(7).EINVALThe argumentlength is negative or larger than the maximum file size.EIOAn I/O error occurred updating the inode.EISDIRThe named file is a directory.ELOOPToo many symbolic links were encountered in translating the pathname.ENAMETOOLONG A component of a pathname exceeded 255 characters, or an entire pathname exceeded 1023 characters.ENOENTThe named file does not exist.ENOTDIR A component of the path prefix is not a directory.EPERMThe underlying filesystem does not support extending a file beyond its current size.EPERMThe operation was prevented by a file seal; seefcntl(2).EROFSThe named file resides on a read-only filesystem.ETXTBSY The file is an executable file that is being executed. Forftruncate() the same errors apply, but instead of things that can be wrong withpath, we now have things that can be wrong with the file descriptor,fd:EBADFfd is not a valid file descriptor.EBADForEINVALfd is not open for writing.EINVALfd does not reference a regular file or a POSIX shared memory object.EINVALorEBADF The file descriptorfd is not open for writing. POSIX permits, and portable applications should handle, either error for this case. (Linux producesEINVAL.)
The details in DESCRIPTION are for XSI-compliant systems. For non-XSI-compliant systems, the POSIX standard allows two behaviors forftruncate() whenlength exceeds the file length (note thattruncate() is not specified at all in such an environment): either returning an error, or extending the file. Like most UNIX implementations, Linux follows the XSI requirement when dealing with native filesystems. However, some nonnative filesystems do not permittruncate() andftruncate() to be used to extend a file beyond its current length: a notable example on Linux is VFAT. On some 32-bit architectures, the calling signature for these system calls differ, for the reasons described insyscall(2).
POSIX.1-2008.
POSIX.1-2001, 4.4BSD, SVr4 (first appeared in 4.2BSD). The original Linuxtruncate() andftruncate() system calls were not designed to handle large file offsets. Consequently, Linux 2.4 addedtruncate64() andftruncate64() system calls that handle large files. However, these details can be ignored by applications using glibc, whose wrapper functions transparently employ the more recent system calls where they are available.
ftruncate() can also be used to set the size of a POSIX shared memory object; seeshm_open(3).
A header file bug in glibc 2.12 meant that the minimum value of_POSIX_C_SOURCErequired to expose the declaration offtruncate() was 200809L instead of 200112L. This has been fixed in later glibc versions.
truncate(1),open(2),stat(2),path_resolution(7)
This page is part of theman-pages (Linux kernel and C library user-space interface documentation) project. Information about the project can be found at ⟨https://www.kernel.org/doc/man-pages/⟩. If you have a bug report for this manual page, see ⟨https://git.kernel.org/pub/scm/docs/man-pages/man-pages.git/tree/CONTRIBUTING⟩. This page was obtained from the tarball man-pages-6.15.tar.gz fetched from ⟨https://mirrors.edge.kernel.org/pub/linux/docs/man-pages/⟩ on 2025-08-11. If you discover any rendering problems in this HTML version of the page, or you believe there is a better or more up- to-date source for the page, or you have corrections or improvements to the information in this COLOPHON (which isnot part of the original manual page), send a mail to man-pages@man7.orgLinux man-pages 6.15 2025-05-17truncate(2)Pages that refer to this page:truncate(1), fallocate(2), F_GETLEASE(2const), F_GET_SEALS(2const), F_NOTIFY(2const), fsync(2), getrlimit(2), io_uring_enter2(2), io_uring_enter(2), memfd_create(2), memfd_secret(2), mmap(2), syscall(2), syscalls(2), io_uring_prep_ftruncate(3), off_t(3type), shm_open(3), inode(7), inotify(7), landlock(7), shm_overview(7), signal-safety(7), xfs_io(8)
HTML rendering created 2025-09-06 byMichael Kerrisk, author ofThe Linux Programming Interface. For details of in-depthLinux/UNIX system programming training courses that I teach, lookhere. Hosting byjambit GmbH. | ![]() |