mknod(2)

NAZWA
mknod, mknodat - tworzy plik specjalny lub zwykły

BIBLIOTEKA
Standardowa biblioteka C (libc, -lc)

SKŁADNIA
#include <sys/stat.h>

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

#include <fcntl.h>           /* Definicja stałych AT_* */
#include <sys/stat.h>

int mknodat(int dirfd, const char *path, mode_t mode, dev_t dev);

    Wymagane ustawienia makr biblioteki glibc (patrz feature_test_macros(7)):

mknod():
    _XOPEN_SOURCE >= 500
        || /* Od glibc 2.19: */ _DEFAULT_SOURCE
        || /* glibc <= 2.19: */ _BSD_SOURCE || _SVID_SOURCE

OPIS
Wywołanie systemowe mknod() tworzy węzeł w systemie plików (plik, plik urządzenia specjalnego lub nazwany potok) o nazwie path, z atrybutami określonymi w mode i dev.

Argument mode określa tryb pliku do użycia oraz typ węzła do utworzenia. Powinien być kombinacją (bitowym LUB) jednego z typów plików, wypisanych poniżej, oraz zera lub więcej bitów trybu pliku, wypisanych w podręczniku inode(7).

Tryb pliku jest modyfikowany przez umask procesu, w standardowy sposób: jeśli brak domyślnych ACL, uprawnieniami tworzonego węzła będą (mode & ~umask).

Typem pliku musi być jeden z: S_IFREG, S_IFCHR, S_IFBLK, S_IFIFO lub S_IFSOCK, co określa, odpowiednio, zwykły plik (utworzony jako pusty), specjalny plik znakowy, specjalny plik blokowy, FIFO (nazwany potok) lub gniazdo domeny Uniksa (zerowy typ pliku jest równoważny S_IFREG).

Jeśli typem pliku jest S_IFCHR lub S_IFBLK, to dev określa główny i poboczny numer nowo tworzonego specjalnego pliku urządzenia (do utworzenia wartości dev przydatny może być makedev(3)); w innych przypadkach jest ignorowane.

Jeśli path już istnieje lub jest dowiązaniem symbolicznym, niniejsze wywołanie zawiedzie z błędem EEXIST.

Nowo tworzony węzeł będzie własnością efektywnego identyfikatora użytkownika procesu. Jeśli katalog zawierający węzeł ma ustawiony bit set-group-ID albo system plików zamontowano z semantyką grup BSD, nowy węzeł odziedziczy własność grupy ze swojego katalogu nadrzędnego; w innym przypadku będzie własnością efektywnego identyfikatora grupy procesu.

  mknodat()
Wywołanie systemowe mknodat() operuje w dokładnie taki sam sposób jak mknod(), z wyjątkiem różnic opisanych tutaj.

Jeśli ścieżka path jest względna, jest to interpretowane w odniesieniu do katalogu, do którego odnosi się deskryptor pliku dirfd (zamiast w odniesieniu do bieżącego katalogu roboczego procesu wywołującego, jak w stosunku do ścieżek względnych robi to mknod()).

Jeśli path jest względna a dirfd ma wartość specjalną AT_FDCWD, to path jest interpretowana w odniesieniu do bieżącego katalogu roboczego procesu wywołującego (jak mknod()).

Jeśli ścieżka path jest bezwzględna, to dirfd jest ignorowane.

Więcej informacji o potrzebie wprowadzenia mknodat() można znaleźć w podręczniku openat(2).

WARTOŚĆ ZWRACANA
mknod() i mknodat() zwracają zero przy powodzeniu. W przypadku błędu, zwracane jest -1 i ustawiane errno wskazując błąd.

BŁĘDY

EACCES
    Katalog nadrzędny nie zezwala na uprawnienie do zapisu wobec procesu lub jeden z katalogów w przedrostku ścieżki path nie zezwala na uprawnienie przeszukania (zob. też path_resolution(7)).

EBADF
    (mknodat()) path jest względna, lecz dirfd nie jest ani AT_FDCWD, ani prawidłowym deskryptorem pliku.

EDQUOT
    Wyczerpano przydział bloków dysku lub i-węzłów użytkownika w systemie plików.

EEXIST
    path już istnieje. Obejmuje to przypadek, gdy path jest dowiązaniem symbolicznym, prawidłowym lub wiszącym.

EFAULT
    path wskazuje poza dostępną dla użytkownika przestrzeń adresową.

EINVAL
    mode zażądał utworzenie czegoś innego niż zwykły plik, specjalny plik urządzenia lub gniazdo.

ELOOP
    Podczas rozwiązywania path napotkano zbyt wiele dowiązań symbolicznych.

ENAMETOOLONG
    path była zbyt długa.

ENOENT
    Składowa path, która powinna być katalogiem nie istnieje lub jest wiszącym dowiązaniem symbolicznym.

ENOMEM
    Brak pamięci jądra.

ENOSPC
    Na urządzeniu zawierającym path brak miejsca na nowy węzeł.

ENOTDIR
    Składowa path, która powinna być katalogiem, w rzeczywistości katalogiem nie jest.

ENOTDIR
    (mknodat()) path jest względna, a dirfd jest deskryptorem pliku odnoszącym się do pliku innego niż katalog.

EPERM
    mode zażądał utworzenia czegoś innego niż zwykły plik, FIFO (nazwany potok) lub gniazdo domeny Uniksa, a wywołujący nie jest uprzywilejowany (Linux: nie ma przywileju CAP_MKNOD); zwracane również, gdy system plików zawierający path nie obsługuje żądanego typu węzła.

EROFS
    path odnosi się do pliku w systemie plików tylko do odczytu.

WERSJE
POSIX.1-2001 wskazuje: „Jedynym przenośnym zastosowaniem mknod() jest tworzenie specjalnego pliku FIFO. Jeśli mode jest różny od S_IFIFO albo dev nie wynosi 0, to zachowanie mknod() jest niezdefiniowane”. Jednak obecnie nigdy nie powinno stosować się mknod() do tego celu; służy do tego mkfifo(3), funkcja specjalnie do tego zdefiniowana.

W Linuksie, za pomocą mknod() nie można tworzyć katalogów. Służy do tego mkdir(2).

STANDARDY
POSIX.1-2024.

HISTORIA

mknod()
    SVr4, 4.4BSD, POSIX.1-2001 (lecz zob. WERSJE).

mknodat()
    Linux 2.6.16, glibc 2.4. POSIX.1-2008.

UWAGI
W protokole odpowiedzialnym za obsługę NFS istnieje wiele nietrafnych rozwiązań. Niektóre z nich mają wpływ na mknod() i mknodat().

ZOBACZ TAKŻE
mknod(1), chmod(2), chown(2), fcntl(2), mkdir(2), mount(2), socket(2), stat(2), umask(2), unlink(2), makedev(3), mkfifo(3), acl(5), path_resolution(7)

TŁUMACZENIE
Tłumaczenie niniejszej strony podręcznika: Michał Kułach <michal.kulach@gmail.com>

Niniejsze tłumaczenie jest wolną dokumentacją. Bliższe informacje o warunkach licencji można uzyskać zapoznając się z GNU General Public License w wersji 3 (https://www.gnu.org/licenses/gpl-3.0.html) lub nowszej. Nie przyjmuje się ŻADNEJ ODPOWIEDZIALNOŚCI.

Błędy w tłumaczeniu strony podręcznika prosimy zgłaszać na adres listy dyskusyjnej manpages-pl-list@lists.sourceforge.net.