---
name: "ftruncate"
section: "2"
platform: "macos"
package: "xnu"
version: "12377.121.6"
release: "macOS 26.5"
platforms: ["linux", "freebsd", "macos"]
url: "https://new.carta.tech/truncate/2"
---

# ftruncate(2)

truncate or extend a file to a specified length

Part of [truncate(2)](/truncate/2.md).

## NAME

**ftruncate**, **truncate** – truncate or extend a file to a specified length

## SYNOPSIS

**#include \<unistd.h\>**

*int*\

**ftruncate**(*int fildes*, *off\_t length*);

*int*\

**truncate**(*const char \*path*, *off\_t length*);

## DESCRIPTION

**ftruncate**() and **truncate**() cause the file named by *path*, or referenced by *fildes*, to be truncated (or extended) to *length* bytes in size. If the file size exceeds  *length*, any extra data is discarded. If the file size is smaller than  *length*, the file is extended and filled with zeros to the indicated length. The **ftruncate**() form requires the file to be open for writing.

Note:  **ftruncate**() and **truncate**() do not modify the current file offset for any open file descriptions associated with the file.

## RETURN VALUES

A value of 0 is returned if the call succeeds.  If the call fails a -1 is returned, and the global variable *errno* specifies the error.

## ERRORS

The **ftruncate**() system call will fail if:

- \[EBADF\]

  *fildes* is not a valid descriptor open for writing.

- \[EFBIG\]

  The file is a regular file and *length* is greater than the offset maximum established in the open file description associated with *fildes*.

- \[EINVAL\]

  *fildes* references a socket, not a file.

- \[EINVAL\]

  *fildes* references a symbolic link.

- \[EINVAL\]

  *fildes* is not open for writing.

- \[EPERM\]

  The named file has its append-only flag set, see the [chflags(2)](/chflags/2.md) manual page for more information.

- \[EROFS\]

  The named file resides on a read-only file system.

The **truncate**() system call will fail if:

- \[EACCES\]

  Search permission is denied for a component of the path prefix.

- \[EACCES\]

  The named file is not writable by the user.

- \[EFAULT\]

  *Path* points outside the process's allocated address space.

- \[EISDIR\]

  The named file is a directory.

- \[ELOOP\]

  Too many symbolic links are encountered in translating the pathname. This is taken to be indicative of a looping symbolic link.

- \[ENAMETOOLONG\]

  A component of a pathname exceeds {NAME\_MAX} characters, or an entire path name exceeds  {PATH\_MAX} characters.

- \[ENOENT\]

  The named file does not exist.

- \[ENOTDIR\]

  A component of the path prefix is not a directory.

- \[EDEADLK\]

  A component of the pathname refers to a “dataless” directory that requires materialization and the I/O policy of the current thread or process disallows dataless directory materialization (see [getiopolicy\_np(3)](/getiopolicy_np/3.md)).

- \[EROFS\]

  The named file resides on a read-only file system.

- \[ETXTBSY\]

  The file is a pure procedure (shared text) file that is being executed.

The **ftruncate**() and **truncate**() system calls will fail if:

- \[EFBIG\]

  The length argument was greater than the maximum file size.

- \[EINTR\]

  A signal is caught during execution.

- \[EINVAL\]

  The *length* argument is less than 0.

- \[EIO\]

  An I/O error occurred while reading from or writing to a file system.

- \[EDEADLK\]

  The file is a “dataless” file that requires materialization and the I/O policy of the current thread or process disallows dataless file materialization (see [getiopolicy\_np(3)](/getiopolicy_np/3.md)).

## SEE ALSO

[open(2)](/open/2.md)

## BUGS

These calls should be generalized to allow ranges of bytes in a file to be discarded.

Use of **truncate**() to extend a file is not portable.

## HISTORY

The **truncate**() and **ftruncate**() function calls appeared in 4.2BSD.
