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

# mknodat(2)

make a special file node

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

## NAME

**mknod**, **mknodat** – make a special file node

## SYNOPSIS

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

*int*\

**mknod**(*const char \*path*, *mode\_t mode*, *dev\_t dev*);

*int*\

**mknodat**(*int fd*, *const char \*path*, *mode\_t mode*, *dev\_t dev*);

## DESCRIPTION

The device special file *path* is created with the major and minor device numbers extracted from *mode*. The access permissions of *path* are constrained by the [umask(2)](/umask/2.md) of the parent process.

If *mode* indicates a block or character special file, *dev* is a configuration-dependent specification of a character or block I/O device and the superblock of the device.  If *mode* does not indicate a block special or character special device, *dev* is ignored.

**mknod**() requires super-user privileges.

The **mknodat**() system call is equivalent to **mknod**() except in the case where *path* specifies a relative path. In this case the newly created fifo file is created relative to the directory associated with the file descriptor *fd* instead of the current working directory. If **mknodat**() is passed the special value AT\_FDCWD in the *fd* parameter, the current working directory is used and the behavior is identical to a call to **mknod**().

## RETURN VALUES

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

## ERRORS

**mknod**() will fail and the file will be not created if:

- \[EACCES\]

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

- \[EACCES\]

  Write permission is denied for the parent directory.

- \[EDQUOT\]

  The directory in which the entry for the new node is being placed cannot be extended; the user's quota of disk blocks on the file system containing the directory has been exhausted.

- \[EDQUOT\]

  The user's quota of inodes for the file system on which the node is being created has been exhausted.

- \[EEXIST\]

  The named file exists.

- \[EFAULT\]

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

- \[EINVAL\]

  One or more of the arguments is invalid.

- \[EIO\]

  An I/O error occurs while making the directory entry or allocating the inode.

- \[ELOOP\]

  Too many symbolic links were 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\]

  A component of the path prefix does not exist or path is an empty string.

- \[ENOSPC\]

  The directory in which the entry for the new node is being placed cannot be extended, because there is no space left on the file system containing the directory.

- \[ENOSPC\]

  There are no free inodes on the file system on which the node is being created.

- \[ENOTDIR\]

  A component of the path prefix is not a directory.

- \[EPERM\]

  The process's effective user ID is not super-user.

- \[EROFS\]

  The created node would reside on a read-only file system.

In addition to the errors returned by the **mknod**(), the **mknodat**() function may fail if:

- \[EBADF\]

  The *path* argument does not specify an absolute path and the *fd* argument is neither AT\_FDCWD nor a valid file descriptor open for searching.

- \[ENOTDIR\]

  The *path* argument is not an absolute path and *fd* is neither AT\_FDCWD nor a file descriptor associated with a directory.

## LEGACY SYNOPSIS

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

The include file has changed.

## SEE ALSO

[chmod(2)](/chmod/2.md), [stat(2)](/stat/2.md), [umask(2)](/umask/2.md), [compat(5)](/compat/5.md)

## HISTORY

A **mknod**() function call appeared in  Version 6 AT&T UNIX. The **mknodat**() system call appeared in macOS 13.0.
