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

# ftok(3)

convert a pathname and a project identifier to a System V IPC key

## NAME

ftok - convert a pathname and a project identifier to a System V IPC key

## LIBRARY

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

## SYNOPSIS

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

**key\_t ftok(const char \****path***, int** *proj\_id***);**

## DESCRIPTION

The **ftok**() function uses the identity of the file named by the given *path* (which must refer to an existing, accessible file) and the least significant 8 bits of *proj\_id* (which must be nonzero) to generate a *key\_t* type System V IPC key, suitable for use with [**msgget**(2)](/msgget/2.md), [**semget**(2)](/semget/2.md), or [**shmget**(2)](/shmget/2.md).

The resulting value is the same for all pathnames that name the same file, when the same value of *proj\_id* is used. The value returned should be different when the (simultaneously existing) files or the project IDs differ.

## RETURN VALUE

On success, the generated *key\_t* value is returned. On failure -1 is returned, with *errno* indicating the error as for the [**stat**(2)](/stat/2.md) system call.

## ATTRIBUTES

For an explanation of the terms used in this section, see [**attributes**(7)](/attributes/7.md).

| | | |
| --- | --- | --- |
| **Interface** | **Attribute** | **Value** |
| **ftok**() | Thread safety | MT-Safe |

## STANDARDS

POSIX.1-2008.

## HISTORY

POSIX.1-2001.

## NOTES

On some ancient systems, the prototype was:

```
key_t ftok(char *path, char proj_id);
```

Today, *proj\_id* is an *int*, but still only 8 bits are used. Typical usage has an ASCII character *proj\_id*, that is why the behavior is said to be undefined when *proj\_id* is zero.

Of course, no guarantee can be given that the resulting *key\_t* is unique. Typically, a best-effort attempt combines the given *proj\_id* byte, the lower 16 bits of the inode number, and the lower 8 bits of the device number into a 32-bit result. Collisions may easily happen, for example between files on */dev/hda1* and files on */dev/sda1*.

## EXAMPLES

See [**semget**(2)](/semget/2.md).

## SEE ALSO

[**msgget**(2)](/msgget/2.md), [**semget**(2)](/semget/2.md), [**shmget**(2)](/shmget/2.md), [**stat**(2)](/stat/2.md), [**sysvipc**(7)](/sysvipc/7.md)
