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

# chflags(2)

set file flags

## NAME

**chflags**, **fchflags** – set file flags

## SYNOPSIS

**#include \<sys/stat.h\>**

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

*int*\

**chflags**(*const char \*path*, *u\_int flags*);

*int*\

**fchflags**(*int fd*, *u\_int flags*);

## DESCRIPTION

The file whose name is given by *path* or referenced by the descriptor *fd* has its flags changed to *flags*.

The flags specified are formed by *or*'ing the following values

- UF\_NODUMP

  Do not dump the file.

- UF\_IMMUTABLE

  The file may not be changed.

- UF\_APPEND

  The file may only be appended to.

- UF\_OPAQUE

  The directory is opaque when viewed through a union stack.

- UF\_HIDDEN

  The file or directory is not intended to be displayed to the user.

- UF\_COMPRESSED

  File is compressed at the file system level.

- SF\_ARCHIVED

  The file has been archived.

- SF\_IMMUTABLE

  The file may not be changed.

- SF\_APPEND

  The file may only be appended to.

- SF\_DATALESS

  The file is a dataless placeholder. The system will attempt to materialize it when accessed according to the dataless file materialization policy of the accessing thread or process. See [getiopolicy\_np(3)](/getiopolicy_np/3.md).

The “UF\_IMMUTABLE”, “UF\_APPEND”, “UF\_OPAQUE”, and “UF\_HIDDEN” flags may be set or unset by either the owner of a file or the super-user.

The “SF\_ARCHIVED”, “SF\_IMMUTABLE” and “SF\_APPEND” flags may only be set or unset by the super-user.

The “SF\_DATALESS” and “UF\_COMPRESSED” flags are internal flags and may not be set or unset from user space.  Attempting to modify them using **chflags**() will result in undefined behaviour.

## RETURN VALUES

Upon successful completion, a value of 0 is returned. Otherwise, -1 is returned and the global variable *errno* is set to indicate the error.

## ERRORS

**chflags**() will fail if:

- \[ENOTDIR\]

  A component of the path prefix is not a directory.

- \[ENAMETOOLONG\]

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

- \[ENOENT\]

  The named file does not exist.

- \[EACCES\]

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

- \[ELOOP\]

  Too many symbolic links were encountered in translating the pathname.

- \[EPERM\]

  The effective user ID does not match the owner of the file and the effective user ID is not the super-user.

- \[EROFS\]

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

- \[EFAULT\]

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

- \[EIO\]

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

- \[ENOTSUP\]

  The operation isn't supported by the filesystem.

**fchflags**() will fail if:

- \[EBADF\]

  The descriptor is not valid.

- \[EINVAL\]

  *fd* refers to a socket, not to a file.

- \[EPERM\]

  The effective user ID does not match the owner of the file and the effective user ID is not the super-user.

- \[EROFS\]

  The file resides on a read-only file system.

- \[EIO\]

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

- \[ENOTSUP\]

  The operation isn't supported by the filesystem.

## SEE ALSO

[chflags(1)](/chflags/1.md), [fflagstostr(3)](/fflagstostr/3.md), [lchflags(3)](/lchflags/3.md), [strtofflags(3)](/strtofflags/3.md), launchd(8)

## HISTORY

The **chflags**() and **fchflags** functions first appeared in 4.4BSD.
