MKNOD(2)

이름
mknod - 디렉토리 또는 특별한 또는 일반적인 파일을 생성한다.

사용법
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

int mknod(const char *pathname, mode_t mode, dev_t dev);

설명
mknod는 mode 와 dev 로 명시된, pathname 이름의 파일시스템 노드 (파일, 장치 특수 파일 또는 named 파이프) 를 생성한다. mode는 생성될 노드의 타입과 소유권을 명시한다. 이는 새로운 노드의 소유권과 아래서 나열된 파일 타입중 하나의 조합이 (비트연산 OR를 사용해서) 되어야한다. 소유권은 일반적으로 프로세스의 umask에 의해 수정된다: 생성된 노드의 소유권은 (mode & ~umask)이다. 일반 파일 (빈 상태로 만들어진다), 문자 특수 파일, 블럭 특수 파일 또는 FIFO (named 파이프)를 생성하기 위한 파일 타입은 각각 S_IFREG, S_IFCHR, S_IFBLK 그리고 S_IFIFO 이고, 일반 파일을 생성하기 위해 0도 가능하다. 만약 파일 타입이 S_IFCHR 또는 S_IFBLK이면 dev는 새로 생성될 장치 특수 파일의 주(major), 부(minor)번호이어야만 한다; 그렇지 않으면, 무시된다. 새로 생성된 노드는 프로세스의 유효 사용자 ID가 소유권을 갖는다. 만약 노드가 위치한 디렉토리에 set-group-id 비트가 설정되어 있거나, 파일 시스템이 BSD 그룹 의미(semantic)에 따라 마운트되어 있다면, 새로운 노드는 자신의 부모 디렉토리로 부터 그룹 소유권을 상속받을 것이다; 그렇지 않으면 프로세스의 유효 그룹 ID가 그룹 소유권을 갖는다.

반환값
mknod는 성공시, 0을 리턴하고 에러시, -1을 리턴한다 (이 경우 errno는 적절히 설정된다).

에러

EPERM
    mode가 FIFO (named 파이프) 이외의 것을 생성하려하고, 호출한 프로세스의 권한이 슈퍼유저(superuser)가 아니다; 또한 pathname이 포함된 파일시스템이 만드려고 하는 노드의 타입을 지원하지 않는다.

EINVAL
    mode가 일반 파일, 장치 특수 파일 또는 FIFO이외의 것을 생성하도록 요구한다.

EEXIST
    pathname이 이미 존재한다.

EFAULT
    pathname이 접근할 수 없는 주소 영역을 가르킨다.

EACCES
    부모 디렉토리가 프로세스에게 쓰기를 허용하지 않거나 pathname에 있는 디렉토리중 하나가 프로세스에게 탐색(실행)을 허용하지 않는다.

ENAMETOOLONG
    pathname이 너무 길다.

ENOENT
    pathname의 디렉토리가 존재하지 않거나 끊어진 심볼릭 링크이다.

ENOTDIR
    pathname의 디렉토리가 실제는 디렉토리가 아니다.

ENOMEM
    사용할 수 있는 커널 메모리가 부족하다.

EROFS
    pathname이 읽기 전용 파일시스템의 파일을 가르킨다.

ELOOP
    pathname을 찾는 도중 너무 많은 심볼릭 링크가 존재한다.

ENOSPC
    pathname이 속한 장치에 새로운 노드를 만들기 위한 공간이 충분치 않다.

호환
SVr4 (그러나 호출하기 위해서는 권한이 필요하다. POSIX는 아니다.) 4.4BSD. 리눅스 버전은 SVr4 버전과는 다르게 파이프를 생성할 때 root 권한이 필요없고, EMULTIHOP, ENOLINK, EINTR과 같은 에러가 기술되어 있지 않다.

버그
mknod는 디렉토리나 소켓 파일을 생성할 수 없고 슈퍼유저가 아닌 유저가 일반 파일을 생성하는 것은 불가능하다. NFS의 프로토콜에는 많은 버그가 존재한다. 이런 버그는 mknod에 영향을 미친다.

관련 항목
read(2), write(2), fcntl(2), close(2), unlink(2), open(2), mkdir(2), stat(2), umask(2), mount(2), socket(2), fopen(3).

역자
정동현 <dhjung@serome.co.kr>, 2000년 4월 20일