Scroll to navigation

mknod(2) System Calls Manual 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 *pathname, mode_t mode, dev_t dev);
#include <fcntl.h>           /* Definicja stałych AT_* */
#include <sys/stat.h>
int mknodat(int dirfd, const char *pathname, 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 pathname, 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 pathname 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 podana w pathname 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 pathname jest względna a dirfd ma wartość specjalną AT_FDCWD, to pathname jest interpretowana w odniesieniu do bieżącego katalogu roboczego procesu wywołującego (jak mknod()).

Jeśli ścieżka pathname 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

Katalog nadrzędny nie zezwala na uprawnienie do zapisu wobec procesu lub jeden z katalogów w przedrostku ścieżki pathname nie zezwala na uprawnienie przeszukania (zob. też path_resolution(7)).
(mknodat) pathname jest względna, lecz dirfd nie jest ani AT_FDCWD, ani prawidłowym deskryptorem pliku.
Wyczerpano przydział bloków dysku lub i-węzłów użytkownika w systemie plików.
pathname już istnieje. Obejmuje to przypadek, gdy pathname jest dowiązaniem symbolicznym, prawidłowym lub wiszącym.
pathname wskazuje poza dostępną dla użytkownika przestrzeń adresową.
mode zażądał utworzenie czegoś innego niż zwykły plik, specjalny plik urządzenia lub gniazdo.
Podczas rozwiązywania pathname napotkano zbyt wiele dowiązań symbolicznych.
pathname było zbyt długie.
Składowa pathname, która powinna być katalogiem nie istnieje lub jest wiszącym dowiązaniem symbolicznym.
Brak pamięci jądra.
Na urządzeniu zawierającym pathname brak miejsca na nowy węzeł.
Składnik pathname, który powinien być katalogiem, w rzeczywistości katalogiem nie jest.
(mknodat) pathname jest względna, a dirfd jest deskryptorem pliku odnoszącym się do pliku innego niż katalog.
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 pathname nie obsługuje żądanego typu węzła.
pathname odnosi się do pliku w systemie plików tylko do odczytu.

WERSJE

mknodat() dodano w Linuksie 2.6.16; obsługę w bibliotece dodano w glibc 2.4.

STANDARDY

mknod(): SVr4, 4.4BSD, POSIX.1-2001 (lecz zob. niżej), POSIX.1-2008.

mknodat(): POSIX.1-2008.

UWAGI

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).

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

Autorami polskiego tłumaczenia niniejszej strony podręcznika są: 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 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.

5 lutego 2023 r. Linux man-pages 6.03