| .\" This manpage is Copyright (C) 1992 Drew Eckhardt; |
| .\" and Copyright (C) 1993 Michael Haardt |
| .\" and Copyright (C) 1993,1994 Ian Jackson |
| .\" and Copyright (C) 2006, 2014, Michael Kerrisk |
| .\" |
| .\" SPDX-License-Identifier: GPL-1.0-or-later |
| .\" |
| .\" Modified 1996-08-18 by urs |
| .\" Modified 2003-04-23 by Michael Kerrisk |
| .\" Modified 2004-06-23 by Michael Kerrisk <mtk.manpages@gmail.com> |
| .\" |
| .TH mknod 2 (date) "Linux man-pages (unreleased)" |
| .SH NAME |
| mknod, mknodat \- create a special or ordinary file |
| .SH LIBRARY |
| Standard C library |
| .RI ( libc ,\~ \-lc ) |
| .SH SYNOPSIS |
| .nf |
| .B #include <sys/stat.h> |
| .P |
| .BI "int mknod(const char *" pathname ", mode_t " mode ", dev_t " dev ); |
| .P |
| .BR "#include <fcntl.h> " "/* Definition of AT_* constants */" |
| .B #include <sys/stat.h> |
| .P |
| .BI "int mknodat(int " dirfd ", const char *" pathname ", mode_t " mode \ |
| ", dev_t " dev ); |
| .fi |
| .P |
| .RS -4 |
| Feature Test Macro Requirements for glibc (see |
| .BR feature_test_macros (7)): |
| .RE |
| .P |
| .BR mknod (): |
| .nf |
| _XOPEN_SOURCE >= 500 |
| .\" || _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED |
| || /* Since glibc 2.19: */ _DEFAULT_SOURCE |
| || /* glibc <= 2.19: */ _BSD_SOURCE || _SVID_SOURCE |
| .fi |
| .SH DESCRIPTION |
| The system call |
| .BR mknod () |
| creates a filesystem node (file, device special file, or |
| named pipe) named |
| .IR pathname , |
| with attributes specified by |
| .I mode |
| and |
| .IR dev . |
| .P |
| The |
| .I mode |
| argument specifies both the file mode to use and the type of node |
| to be created. |
| It should be a combination (using bitwise OR) of one of the file types |
| listed below and zero or more of the file mode bits listed in |
| .BR inode (7). |
| .P |
| The file mode is modified by the process's |
| .I umask |
| in the usual way: in the absence of a default ACL, the permissions of the |
| created node are |
| .RI ( mode " & \[ti]" umask ). |
| .P |
| The file type must be one of |
| .BR S_IFREG , |
| .BR S_IFCHR , |
| .BR S_IFBLK , |
| .BR S_IFIFO , |
| or |
| .B S_IFSOCK |
| .\" (S_IFSOCK since Linux 1.2.4) |
| to specify a regular file (which will be created empty), character |
| special file, block special file, FIFO (named pipe), or UNIX domain socket, |
| respectively. |
| (Zero file type is equivalent to type |
| .BR S_IFREG .) |
| .P |
| If the file type is |
| .B S_IFCHR |
| or |
| .BR S_IFBLK , |
| then |
| .I dev |
| specifies the major and minor numbers of the newly created device |
| special file |
| .RB ( makedev (3) |
| may be useful to build the value for |
| .IR dev ); |
| otherwise it is ignored. |
| .P |
| If |
| .I pathname |
| already exists, or is a symbolic link, this call fails with an |
| .B EEXIST |
| error. |
| .P |
| The newly created node will be owned by the effective user ID of the |
| process. |
| If the directory containing the node has the set-group-ID |
| bit set, or if the filesystem is mounted with BSD group semantics, the |
| new node will inherit the group ownership from its parent directory; |
| otherwise it will be owned by the effective group ID of the process. |
| .\" |
| .\" |
| .SS mknodat() |
| The |
| .BR mknodat () |
| system call operates in exactly the same way as |
| .BR mknod (), |
| except for the differences described here. |
| .P |
| If the pathname given in |
| .I pathname |
| is relative, then it is interpreted relative to the directory |
| referred to by the file descriptor |
| .I dirfd |
| (rather than relative to the current working directory of |
| the calling process, as is done by |
| .BR mknod () |
| for a relative pathname). |
| .P |
| If |
| .I pathname |
| is relative and |
| .I dirfd |
| is the special value |
| .BR AT_FDCWD , |
| then |
| .I pathname |
| is interpreted relative to the current working |
| directory of the calling process (like |
| .BR mknod ()). |
| .P |
| If |
| .I pathname |
| is absolute, then |
| .I dirfd |
| is ignored. |
| .P |
| See |
| .BR openat (2) |
| for an explanation of the need for |
| .BR mknodat (). |
| .SH RETURN VALUE |
| .BR mknod () |
| and |
| .BR mknodat () |
| return zero on success. |
| On error, \-1 is returned and |
| .I errno |
| is set to indicate the error. |
| .SH ERRORS |
| .TP |
| .B EACCES |
| The parent directory does not allow write permission to the process, |
| or one of the directories in the path prefix of |
| .I pathname |
| did not allow search permission. |
| (See also |
| .BR path_resolution (7).) |
| .TP |
| .B EBADF |
| .RB ( mknodat ()) |
| .I pathname |
| is relative but |
| .I dirfd |
| is neither |
| .B AT_FDCWD |
| nor a valid file descriptor. |
| .TP |
| .B EDQUOT |
| The user's quota of disk blocks or inodes on the filesystem has been |
| exhausted. |
| .TP |
| .B EEXIST |
| .I pathname |
| already exists. |
| This includes the case where |
| .I pathname |
| is a symbolic link, dangling or not. |
| .TP |
| .B EFAULT |
| .IR pathname " points outside your accessible address space." |
| .TP |
| .B EINVAL |
| .I mode |
| requested creation of something other than a regular file, device |
| special file, FIFO or socket. |
| .TP |
| .B ELOOP |
| Too many symbolic links were encountered in resolving |
| .IR pathname . |
| .TP |
| .B ENAMETOOLONG |
| .IR pathname " was too long." |
| .TP |
| .B ENOENT |
| A directory component in |
| .I pathname |
| does not exist or is a dangling symbolic link. |
| .TP |
| .B ENOMEM |
| Insufficient kernel memory was available. |
| .TP |
| .B ENOSPC |
| The device containing |
| .I pathname |
| has no room for the new node. |
| .TP |
| .B ENOTDIR |
| A component used as a directory in |
| .I pathname |
| is not, in fact, a directory. |
| .TP |
| .B ENOTDIR |
| .RB ( mknodat ()) |
| .I pathname |
| is relative and |
| .I dirfd |
| is a file descriptor referring to a file other than a directory. |
| .TP |
| .B EPERM |
| .I mode |
| requested creation of something other than a regular file, |
| FIFO (named pipe), or UNIX domain socket, and the caller |
| is not privileged (Linux: does not have the |
| .B CAP_MKNOD |
| capability); |
| .\" For UNIX domain sockets and regular files, EPERM is returned only in |
| .\" Linux 2.2 and earlier; in Linux 2.4 and later, unprivileged can |
| .\" use mknod() to make these files. |
| also returned if the filesystem containing |
| .I pathname |
| does not support the type of node requested. |
| .TP |
| .B EROFS |
| .I pathname |
| refers to a file on a read-only filesystem. |
| .SH VERSIONS |
| POSIX.1-2001 says: "The only portable use of |
| .BR mknod () |
| is to create a FIFO-special file. |
| If |
| .I mode |
| is not |
| .B S_IFIFO |
| or |
| .I dev |
| is not 0, the behavior of |
| .BR mknod () |
| is unspecified." |
| However, nowadays one should never use |
| .BR mknod () |
| for this purpose; one should use |
| .BR mkfifo (3), |
| a function especially defined for this purpose. |
| .P |
| Under Linux, |
| .BR mknod () |
| cannot be used to create directories. |
| One should make directories with |
| .BR mkdir (2). |
| .\" and one should make UNIX domain sockets with socket(2) and bind(2). |
| .SH STANDARDS |
| POSIX.1-2008. |
| .SH HISTORY |
| .TP |
| .BR mknod () |
| SVr4, 4.4BSD, POSIX.1-2001 (but see VERSIONS). |
| .\" The Linux version differs from the SVr4 version in that it |
| .\" does not require root permission to create pipes, also in that no |
| .\" EMULTIHOP, ENOLINK, or EINTR error is documented. |
| .TP |
| .BR mknodat () |
| Linux 2.6.16, |
| glibc 2.4. |
| POSIX.1-2008. |
| .SH NOTES |
| There are many infelicities in the protocol underlying NFS. |
| Some of these affect |
| .BR mknod () |
| and |
| .BR mknodat (). |
| .SH SEE ALSO |
| .BR mknod (1), |
| .BR chmod (2), |
| .BR chown (2), |
| .BR fcntl (2), |
| .BR mkdir (2), |
| .BR mount (2), |
| .BR socket (2), |
| .BR stat (2), |
| .BR umask (2), |
| .BR unlink (2), |
| .BR makedev (3), |
| .BR mkfifo (3), |
| .BR acl (5), |
| .BR path_resolution (7) |