---
name: "msync"
section: "2"
platform: "linux"
package: "man-pages"
version: "6.19-1"
release: "Arch Linux 2026-11-01"
platforms: ["linux", "freebsd", "macos"]
url: "https://new.carta.tech/msync"
---

# msync(2)

synchronize a file with a memory map

## NAME

msync - synchronize a file with a memory map

## LIBRARY

Standard C library (*libc*, *-lc*)

## SYNOPSIS

```
#include <sys/mman.h>
```

**int msync(**size\_t length;           **void** *addr***\[***length***\], size\_t** *length***, int** *flags***);**

## DESCRIPTION

**msync**() flushes changes made to the in-core copy of a file that was mapped into memory using [**mmap**(2)](/mmap/2.md) back to the filesystem. Without use of this call, there is no guarantee that changes are written back before [**munmap**(2)](/munmap/2.md) is called. To be more precise, the part of the file that corresponds to the memory area starting at *addr* and having length *length* is updated.

The *flags* argument should specify exactly one of **MS\_ASYNC** and **MS\_SYNC**, and may additionally include the **MS\_INVALIDATE** bit. These bits have the following meanings:

- **MS\_ASYNC**

  Specifies that an update be scheduled, but the call returns immediately.

- **MS\_SYNC**

  Requests an update and waits for it to complete.

- **MS\_INVALIDATE**

  Asks to invalidate other mappings of the same file (so that they can be updated with the fresh values just written).

## RETURN VALUE

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

## ERRORS

- **EBUSY**

  **MS\_INVALIDATE** was specified in *flags*, and a memory lock exists for the specified address range.

- **EINVAL**

  *addr* is not a multiple of PAGESIZE; or any bit other than **MS\_ASYNC** \| **MS\_INVALIDATE** \| **MS\_SYNC** is set in *flags*; or both **MS\_SYNC** and **MS\_ASYNC** are set in *flags*.

- **ENOMEM**

  The indicated memory (or part of it) was not mapped.

## VERSIONS

According to POSIX, either **MS\_SYNC** or **MS\_ASYNC** must be specified in *flags*, and indeed failure to include one of these flags will cause **msync**() to fail on some systems. However, Linux permits a call to **msync**() that specifies neither of these flags, with semantics that are (currently) equivalent to specifying **MS\_ASYNC**. (Since Linux 2.6.19, **MS\_ASYNC** is in fact a no-op, since the kernel properly tracks dirty pages and flushes them to storage as necessary.) Notwithstanding the Linux behavior, portable, future-proof applications should ensure that they specify either **MS\_SYNC** or **MS\_ASYNC** in *flags*.

## STANDARDS

POSIX.1-2024.

## HISTORY

SUSv1, POSIX.1-1996.

This call was introduced in Linux 1.3.21, and then used **EFAULT** instead of **ENOMEM**. In Linux 2.4.19, this was changed to the POSIX value **ENOMEM**.

On POSIX systems on which **msync**() is available, both **\_POSIX\_MAPPED\_FILES** and **\_POSIX\_SYNCHRONIZED\_IO** are defined in *\<unistd.h\>* to a value greater than 0. (See also [**sysconf**(3)](/sysconf/3.md).)

## SEE ALSO

[**mmap**(2)](/mmap/2.md)

B.O. Gallmeister, POSIX.4, O'Reilly, pp. 128–129 and 389–391.
