mknod(2)

NUME
mknod, mknodat - creează un fișier special sau obișnuit

BIBLIOTECA
Biblioteca C standard (libc, -lc)

SINOPSIS
#include <sys/stat.h>

int mknod(const char *rută, mode_t mod, dev_t dispozitiv);

#include <fcntl.h>           /* Definirea constantelor AT_* */
#include <sys/stat.h>

int mknodat(int fd-director, const char *rută, mode_t mod, dev_t dispozitiv);

    Cerințe pentru macrocomenzi de testare a caracteristicilor pentru glibc (consultați feature_test_macros(7)):

mknod():
    _XOPEN_SOURCE >= 500
        || /* Începând cu glibc 2.19: */ _DEFAULT_SOURCE
        || /* glibc <= 2.19: */ _BSD_SOURCE || _SVID_SOURCE

DESCRIERE
Apelul de sistem mknod() creează un nod de sistem de fișiere (fișier, fișier special de dispozitiv sau conductă cu nume) numit rută, cu atributele specificate de mod și dispozitiv.

Argumentul mod specifică atât modul de fișier care urmează să fie utilizat, cât și tipul de nod care urmează să fie creat. Acesta ar trebui să fie o combinație (utilizând logica SAU) a unuia dintre tipurile de fișiere enumerate mai jos și a zero sau mai mulți biți ai modului de fișier enumerați în inode(7).

Modul fișierului este modificat de umask al procesului în mod obișnuit: în absența unei ACL implicite, permisiunile nodului creat sunt (mod & ~umask).

Tipul de fișier trebuie să fie unul dintre S_IFREG, S_IFCHR, S_IFBLK, S_IFIFO sau S_IFSOCK pentru a specifica un fișier obișnuit (care va fi creat gol), un fișier special de caractere, un fișier special de blocuri, un FIFO (conductă cu nume) sau, respectiv, un soclu de domeniu UNIX; (tipul de fișier zero este echivalent cu tipul S_IFREG).

Dacă tipul de fișier este S_IFCHR sau S_IFBLK, atunci dispozitiv specifică numerele majore și minore ale fișierului special de dispozitiv nou creat (makedev(3) poate fi util pentru a construi valoarea pentru dispozitiv); altfel, este ignorat.

Dacă ruta există deja sau este o legătură simbolică, acest apel eșuează cu o eroare EEXIST.

Nodul nou creat va fi deținut de ID-ul de utilizator efectiv al procesului. Dacă directorul care conține nodul are bitul set-group-ID activat sau dacă sistemul de fișiere este montat cu semantica de grup BSD, noul nod va moșteni proprietatea de grup de la directorul său părinte; în caz contrar, acesta va fi deținut de ID-ul de grup efectiv al procesului.

  mknodat()
Apelul de sistem mknodat() funcționează exact în același mod ca mknod(), cu excepția diferențelor descrise aici.

Dacă ruta dată în rută este relativă, atunci aceasta este interpretată în raport cu directorul la care face referire descriptorul de fișier fd-director ( și nu în raport cu directorul curent de lucru al procesului apelant, așa cum face mknod() pentru un nume de rută relativ).

Dacă ruta este relativă și fd-director este valoarea specială AT_FDCWD, atunci ruta este interpretată relativ la directorul curent de lucru al procesului apelant (ca mknod()).

Dacă ruta este absolută, atunci fd-director este ignorat.

A se vedea openat(2) pentru o explicație a necesității mknodat().

VALOAREA RETURNATĂ
mknod() și mknodat() returnează zero în caz de succes. În caz de eroare, este returnat -1, iar errno este configurată pentru a indica eroarea.

ERORI-IEȘIRE

EACCES
    Directorul părinte nu permite permisiunea de scriere a procesului sau unul dintre directorii din prefixul rutei rută nu a permis permisiunea de căutare; (a se vedea și path_resolution(7)).

EBADF
    (mknodat()) ruta este relativă, dar fd-director nu este nici AT_FDCWD, nici un descriptor de fișier valid.

EDQUOT
    Cota utilizatorului de blocuri de disc sau de noduri-i pe sistemul de fișiere a fost epuizată.

EEXIST
    ruta există deja. Aceasta include cazul în care nume-rută este o legătură simbolică, suspendată sau nu.

EFAULT
    ruta indică în afara spațiului de adrese accesibil.

EINVAL
    mode a solicitat crearea a altceva decât un fișier obișnuit, un fișier special de dispozitiv, FIFO sau soclu.

ELOOP
    S-au întâlnit prea multe legături simbolice în rezolvarea rutei.

ENAMETOOLONG
    ruta era prea lungă.

ENOENT
    O componentă de director din rută nu există sau este o legătură simbolică ruptă.

ENOMEM
    Nu a fost disponibilă suficientă memorie pentru nucleu.

ENOSPC
    Dispozitivul care conține ruta nu are spațiu pentru noul nod.

ENOTDIR
    O componentă utilizată ca director în rută nu este, de fapt, un director.

ENOTDIR
    (mknodat()) ruta este relativă și fd-director este un descriptor de fișier care se referă la un alt fișier decât un director.

EPERM
    mode a solicitat crearea a altceva decât un fișier obișnuit, FIFO (conductă cu nume) sau soclu de domeniu UNIX, iar apelantul nu este privilegiat (Linux: nu are capacitatea CAP_MKNOD); returnat de asemenea dacă sistemul de fișiere care conține ruta nu acceptă tipul de nod solicitat.

EROFS
    ruta se referă la un fișier pe un sistem de fișiere numai-pentru-citire.

VERSIUNI
POSIX.1-2001 spune: „Singura utilizare portabilă a mknod() este de a crea un fișier special FIFO. Dacă mode nu este S_IFIFO sau dispozitiv nu este 0, comportamentul lui mknod() este nespecificat.” Cu toate acestea, în zilele noastre nu ar trebui să se utilizeze niciodată mknod() în acest scop; ar trebui să se utilizeze mkfifo(3), o funcție special definită pentru acest scop.

Sub Linux, mknod() nu poate fi utilizat pentru a crea directoare. Trebuie să creați directoare cu mkdir(2).

STANDARDE
POSIX.1-2024 XSI.

ISTORIC

mknod()
    SVr4, 4.4BSD, SUSv1, POSIX.1-2001 XSI (dar a se vedea secțiunea VERSIUNI).

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

NOTE
Există multe neajunsuri în protocolul care stă la baza NFS. Unele dintre acestea afectează mknod() și mknodat().

CONSULTAȚI ȘI
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)

TRADUCERE
Traducerea în limba română a acestui manual a fost făcută de Remus-Gabriel Chelu <remusgabriel.chelu@disroot.org>

Această traducere este documentație gratuită; citiți Licența publică generală GNU Versiunea 3 (https://www.gnu.org/licenses/gpl-3.0.html) sau o versiune ulterioară cu privire la condiții privind drepturile de autor. NU se asumă NICIO RESPONSABILITATE.

Dacă găsiți erori în traducerea acestui manual, vă rugăm să trimiteți un e-mail la translation-team-ro@lists.sourceforge.net.