# truncate

## NAME



           truncate, ftruncate - truncate a file to a specified length
    


## LIBRARY



           Standard C library (_libc_ , _-lc_)
    


## SYNOPSIS



           **#include <unistd.h>**
    
           **int truncate(const char ***_path_**, off_t** _length_**);**
           **int ftruncate(int** _fd_**, off_t** _length_**);**
    
       Feature Test Macro Requirements for glibc (see
       feature_test_macros(7)):
    
           **truncate**():
               _XOPEN_SOURCE >= 500
                   || /* Since glibc 2.12: */ _POSIX_C_SOURCE >= 200809L
                   || /* glibc <= 2.19: */ _BSD_SOURCE
    
           **ftruncate**():
               _XOPEN_SOURCE >= 500
                   || /* Since glibc 2.3.5: */ _POSIX_C_SOURCE >= 200112L
                   || /* glibc <= 2.19: */ _BSD_SOURCE
    


## DESCRIPTION



           The **truncate**() and **ftruncate**() functions cause the regular file
           named by _path_ or referenced by _fd_ to be truncated to a size of
           precisely _length_ 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; see inode(7)) for the file are updated, and the set-
           user-ID and set-group-ID mode bits may be cleared.
    
           With **ftruncate**(), the file must be open for writing; with
           **truncate**(), the file must be writable.
    


## RETURN VALUE



           On success, zero is returned.  On error, -1 is returned, and _errno_
           is set to indicate the error.
    


## ERRORS



           For **truncate**():
    
           **EACCES** Search permission is denied for a component of the path
                  prefix, or the named file is not writable by the user.
                  (See also path_resolution(7).)
    
           **EFAULT** The argument _path_ points outside the process's allocated
                  address space.
    
           **EFBIG** The argument _length_ is larger than the maximum file size.
                  (XSI)
    
           **EINTR** While blocked waiting to complete, the call was interrupted
                  by a signal handler; see fcntl(2) and signal(7).
    
           **EINVAL** The argument _length_ is negative or larger than the maximum
                  file size.
    
           **EIO** An I/O error occurred updating the inode.
    
           **EISDIR** The named file is a directory.
    
           **ELOOP** Too 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.
    
           **ENOENT** The named file does not exist.
    
           **ENOTDIR**
                  A component of the path prefix is not a directory.
    
           **EPERM** The underlying filesystem does not support extending a file
                  beyond its current size.
    
           **EPERM** The operation was prevented by a file seal; see fcntl(2).
    
           **EROFS** The named file resides on a read-only filesystem.
    
           **ETXTBSY**
                  The file is an executable file that is being executed.
    
           For **ftruncate**() the same errors apply, but instead of things that
           can be wrong with _path_ , we now have things that can be wrong with
           the file descriptor, _fd_ :
    
           **EBADF** _fd_ is not a valid file descriptor.
    
           **EBADF** or **EINVAL**
                  _fd_ is not open for writing.
    
           **EINVAL** _fd_ does not reference a regular file or a POSIX shared
                  memory object.
    
           **EINVAL** or **EBADF**
                  The file descriptor _fd_ is not open for writing.  POSIX
                  permits, and portable applications should handle, either
                  error for this case.  (Linux produces **EINVAL**.)
    


## VERSIONS



           The details in DESCRIPTION are for XSI-compliant systems.  For
           non-XSI-compliant systems, the POSIX standard allows two behaviors
           for **ftruncate**() when _length_ exceeds the file length (note that
           **truncate**() 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 permit **truncate**() and **ftruncate**() 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 in syscall(2).
    


## STANDARDS



           POSIX.1-2008.
    


## NOTES



           **ftruncate**() can also be used to set the size of a POSIX shared
           memory object; see shm_open(3).
    


## BUGS



           A header file bug in glibc 2.12 meant that the minimum value of
           **_POSIX_C_SOURCE** required to expose the declaration of **ftruncate**()
           was 200809L instead of 200112L.  This has been fixed in later
           glibc versions.
    


* * *