mkdir, mkdirat - make a directory
int mkdir(const char *path, mode_t mode);
int mkdirat(int fd, const char *path, mode_t mode);
The mkdir() and mkdirat() functions create a new directory named
by the path name pointed to by path. The mode of the new directory is
initialized from mode (see chmod(2) for values of mode). The
protection part of the mode argument is modified by the process's file
creation mask (see umask(2)).
The directory's owner ID is set to the process's effective
user ID. The directory's group ID is set to the process's effective
group ID, or if the S_ISGID bit is set in the parent directory, then
the group ID of the directory is inherited from the parent. The
S_ISGID bit of the new directory is inherited from the parent
If path names a symbolic link, mkdir() and
mkdirat() fail and set errno to EEXIST.
The newly created directory is empty with the exception of entries
for itself (.) and its parent directory (..).
The mkdirat() function behaves similarly to mkdir();
however, if path is a relative path, then the directory represented
by fd is used as the starting point for resolving path. To use
the processes current working directory, fd may be set to the value
Upon successful completion, mkdir() and mkdirat()
mark for update the st_atime, st_ctime and st_mtime
fields of the directory. Also, the st_ctime and st_mtime
fields of the directory that contains the new entry are marked for
Upon successful completion, 0 is returned. Otherwise, −1 is
returned, no directory is created, and errno is set to indicate the
The mkdir() and mkdirat() functions will fail if:
Either a component of the path prefix denies search
permission or write permission is denied on the parent directory of the
directory to be created.
The directory where the new file entry is being placed
cannot be extended because the user's quota of disk blocks on that file system
has been exhausted; the new directory cannot be created because the user's
quota of disk blocks on that file system has been exhausted; or the user's
quota of inodes on the file system where the file is being created has been
The named file already exists.
The path argument points to an illegal
An attempt was made to create an extended attribute that
is a directory.
An I/O error has occurred while accessing the file
The path argument includes non-UTF8 characters and the
file system accepts only file names where all characters are part of the UTF-8
Too many symbolic links were encountered in translating
path, or a loop exists in symbolic links encountered during resolution
The maximum number of links to the parent directory would
The length of the path argument exceeds
PATH_MAX, or the length of a path component exceeds
NAME_MAX while _POSIX_NO_TRUNC is in effect.
A component of the path prefix does not exist or is a
The path argument points to a remote machine and
the link to that machine is no longer active.
No free space is available on the device containing the
A component of the path prefix is not a directory. For
linkat(), if path is a relative path and fd refers to a
valid file descriptor which is not a directory.
The path prefix resides on a read-only file system.
The mkdirat() function will fail if:
The path path is a relative path and fd is
not a valid open file descriptor or the value AT_FDCWD.
The mkdir() function may fail if:
As a result of encountering a symbolic link in resolution
of the path argument, the length of the substituted pathname string
Example 1 Create a directory.
The following example demonstrates how to create a directory named
/home/cnd/mod1, with read, write, and search permissions for owner
and group, and with read and search permissions for others.
status = mkdir("/home/cnd/mod1",
S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH);
See attributes(5) for descriptions of the following attributes: