Linux Command Open'i öyrənin

Sinopsis

#include "A HREF =" faylı: /usr/include/sys/types.h "> sys / types.h> #include" A HREF = "fayl: /usr/include/sys/stat.h"> sys / stat.h> #include << A HREF = "fayl: /usr/include/fcntl.h"> fcntl.h> int açıq (const char * pathname , int bayraqları ); int açıq (const char * pathname , int bayraqları , mode_t rejimi ); int creat (const char * pathname, mode_t rejimi );

Təsvir

Açıq () sistem çağırışı linux komutu , bir yolun bir fayl təsvirinə çevrilməsi üçün istifadə olunur ( oxumaq , yazmaq və s. Kimi sonrakı I / O istifadə üçün kiçik, qeyri-mənfi tam sayını). Zəngin müvəffəqiyyətə çatdıqda fayl tanımlayıcısı bu proses üçün hazırda açılmayan ən aşağı fayl təsvirçisi olaraq geri qaytarılır. Bu zəng başqa bir proseslə paylaşılmayan yeni bir açıq fayl yaradır. (Lakin paylaşılan açıq fayllar fork (2) sistem çağırışı ilə yarana bilər). Yeni fayl təsvirçisi exec funksiyaları arasında açıq qalır (bax fcntl (2)). Faylın ofseti faylın başlanğıcına təyin olunur.

Parametr bayraqları O_RDONLY , O_WRONLY və ya O_RDWR-dən ibarətdir, bu faylın yalnız oxunan, yalnız yazma və ya oxumaq / yazmağı tələb etməsi, bitseksiyası və ya d aşağıda göstərilənlərin sıfır və ya daha çox olması:

O_CREAT

Fayl yoxdursa, yaradılacaq. Faylın sahibi (istifadəçi kimliyi) prosesin effektiv istifadəçi kimliyinə təyin olunur. Qrupun mülkiyyəti (qrup ID) prosesin effektiv qrupu kimliyinə və ya üst kataloqun qrup şəxsiyyətinə (fayl sistemi növü və quraşdırma variantları və üst qovluğun rejimi, bax: variantları bsdgroups və ext2 fayl sisteminin sysvgroups , mount (8)).

O_EXCL

O_CREAT ilə istifadə edildikdə , fayl zaten varsa, bu bir səhvdir və açıq olur . Bu kontekstdə, onun nöqtələrindən asılı olmayaraq, simvolik bir əlaqə mövcuddur. O_EXCL NFS fayl sistemlərində sındırıldı, kilidləmə vəzifələrini yerinə yetirmək üçün ona güvənən proqramlar yarış şərtlərini ehtiva edir. Bir kilidləmə faylını istifadə edərək atom faylının kilidlənməsi üçün həll eyni fs-də (məsələn, hostname və pid daxil olmaqla) unikal bir fayl yaratmaq, kilidlənmə ilə əlaqə yaratmaq üçün link (2) istifadə etməkdir. Link () 0 qaytarırsa, kilid müvəffəqiyyətlidir. Əks halda, linkin sayının 2-ə yüksəldiyini yoxlamaq üçün unikal faylda stat (2) istifadə edin, bu halda kilid də uğurludur.

O_NOCTTY

Yol adı terminal cihazına istinad edirsə --- baxın tty (4) --- prosesin yoxluğuna baxmayaraq prosesin nəzarət terminalı olmayacaqdır.

O_TRUNC

Fayl zaten var və normal bir fayldır və açıq rejimi yazmağa imkan verir (yəni, O_RDWR və ya O_WRONLY) 0 uzunluğuna qədər kəsiləcək. Fayl FIFO və ya terminal qurğusudursa, O_TRUNC bayrağı göz ardı edilir. Əks halda, O_TRUNC təsiri dəqiqləşdirilmir. (Bir çox Linux versiyasında itkin düşəcək, digər versiyalarda bir səhv qaytaracaq.)

O_APPEND

Fayl append rejimində açılır. Hər yazmadan əvvəl, fayl göstəricisi, lseek ilə olduğu kimi, faylın sonunda yerləşdirilir. O_APPEND, birdən çox proses bir anda bir faylya məlumat əlavə edərsə, NFS fayl sistemlərində zədələnmiş fayllara yol aça bilər. Çünki NFS bir faylya əlavəni dəstəkləmir, ona görə də müştəri çekirdeği bir yarış vəziyyəti olmadan həyata keçirə bilmədi.

O_NONBLOCK və ya O_NDELAY

Mümkün olduqda, fayl qeyri-blocker rejimində açılır. Qaytarılmayan fayl təsvirində nə açıq, nə də sonrakı əməliyyatlar çağırış prosesini gözləməyə səbəb olacaq. FIFOların (adlandırılmış boruların) işlənməsi üçün də beşi (4) baxın. Bu rejim FIFO-dan başqa fayllara təsir göstərməməlidir.

O_SYNC

Fayl sinxron I / O üçün açılır. Nəticədə olan fayl descriptoruna yazılan hər hansı bir məlumat, data fiziki olaraq əsas donanmaya yazılana qədər axtarış prosesini blok edəcək. Baxmayaraq aşağıda baxın.

O_NOFOLLOW

Pathname simvolik bir keçiddirsə , onda uğursuz olur. Bu, 2.1.126 versiyasında Linux-a əlavə olan FreeBSD uzadılmasıdır. Yolun əvvəlki komponentlərində simvolik əlaqələr hələ də təqib olunacaq. Glibc 2.0.100-dən başlıqlar və daha sonra bu bayrağın tərifi daxildir; 2.1.126-dən əvvəl kernellər istifadə edildikdə onu görməyəcəkdir .

O_DIRECTORY

Pathname bir qovluq deyilsə, açıq olana səbəb olur. Bu bayraq Linux- una uyğun və opendir (3) bir FIFO və ya tape qurğusuna çağırılırsa, lakin opendirin tətbiqindən kənarda istifadə edilməməsi halında, .

O_DIRECT

I / O'nin önbellek effektlərini bu fayldan və bu fayldan asılı olaraq azaltmağa çalışın. Ümumiyyətlə bu, performansı azaldır, ancaq xüsusi hallarda faydalıdır, məsələn, ərizələr öz caching'lərini aparır. Fayl I / O , istifadəçi kosmik tamponlarından birbaşa həyata keçirilir. I / O sinxron, yəni oxumaq (2) və ya sistem çağırışının yazılmasından sonra məlumatların köçürülməsi təmin edilir. Transfer ölçüsü və istifadəçi tamponun və faylın ofsetinin hizalanması fayl sisteminin mantıksal blok ölçüsünün çoxluğu olmalıdır.
Bu bayraq bir sıra Unix kimi sistemlərdə dəstəklənir; dəstəyi Linux altında 2.4.10 versiyası əlavə edildi.
Block cihazlar üçün semantically oxşar bir interfeys xammal (8) təsvir olunur.

O_ASYNC

Bir siqnal yaradın (SIGIO default olaraq, lakin fcntl (2) ilə dəyişdirilə bilər) giriş və ya çıxış bu fayl descriptorunda mümkün olardı. Bu xüsusiyyət yalnız terminallar, pseudo-terminallar və yuvalar üçün mümkündür. Daha ətraflı məlumat üçün fcntl (2) -yə baxın.

O_LARGEFILE

Böyük Dosyalar Sistemini dəstəkləyən 32 bit sistemlərdə 31 bitdə açılmayan faylları təqdim etməyə imkan verin.

Faylın açılmasından sonra bu isteğe bağlı bayraqlardan bəziləri fcntl istifadə edərək dəyişdirilə bilər.

Müqavilə rejimi yeni bir fayl yaradıldığında istifadə etmək icazələrini müəyyənləşdirir. Prosedurun umaskası ilə adi şəkildə dəyişir: yaradılmış faylın icazələri (rejimi & umask) . Qeyd edək ki, bu rejim yalnız yeni yaradılan faylın gələcək çıxışlarına tətbiq edilir; yalnız oxunan bir fayl yaradan açıq zəng, bir oxumaq / yazma fayl təsvirini yaxşı qaytara bilər.

Aşağıdakı sembolik sabitlər rejimi təmin edir:

S_IRWXU

00700 istifadəçi (fayl sahibi) oxumaq, yazmaq və icazəni icra edir

S_IRUSR (S_IREAD)

00400 istifadəçisinin oxumaq icazəsi var

S_IWUSR (S_IWRITE)

00200 istifadəçisinin yazmaq icazəsi var

S_IXUSR (S_IEXEC)

00100 istifadəçisinin icazəsi var

S_IRWXG

00070 qrupu, oxumaq, yazmaq və icazəni icra edir

S_IRGRP

00040 qrupu oxudu

S_IWGRP

00020 qrupu yazmaq icazəsi var

S_IXGRP

00010 qrupu icazə verməkdədir

S_IRWXO

00007 nəfər oxudu, yazıb icra etdi

S_IROTH

00004 nəfər oxumaq icazəsi var

S_IWOTH

00002 nəfərin yazı icazəsi var

S_IXOTH

00001 başqasının icazəsi var

O_CREAT bayraqlarda olduğunda rejimi göstərilməlidir və başqa hal nəzərdə tutulmur .

yaradın, O_CREAT | O_WRONLY | O_TRUNC'a bərabər olan bayraqlarla açılmağa bərabərdir.

RETURN VALUE

açıqyaradıcı yeni fayl təsvirçisini qaytarır, yaxud bir səhv baş verərsə -1 (bu halda, errno düzgün müəyyən edilir). Açıq cihazın xüsusi faylları aça bilər, lakin yaradıcı onları yaratmaq mümkün deyil - əvəzinə mknod (2) istifadə edin.

UID Xəritəçəkmə sistemi ilə işləyən NFS fayl sistemlərində açıq bir fayl təsvirçisi qayıda bilər, ancaq oxumaq (2) istəkləri EACCES ilə rədd edilir . Müştərinin izinleri denetleyerek açar , çünki UID eşleme server tarafından okuma ve yazma istekleri üzerine gerçekleştirilir.

Fayl yeni yaradılıbsa, atim, ctime, mtime sahələri cari vaxta təyin olunur və üst dizinin ctime və mtime sahələri belədir. Əks halda, fayl O_TRUNC bayrağından görə dəyişdirilirsə, onun ctime və mtime sahələri cari dəfə müəyyən edilir.

Səhvlər

EEXIST

yol adı artıq mövcuddur və O_CREATO_EXCL istifadə edilmişdir.

EISDIR

Yol adı bir qovluğa istinad edir və istənilən yazı (yəni, O_WRONLY və ya O_RDWR təyin olunur) daxildir.

EACCES

Dosyaya istənilən girişə icazə verilmir və ya yol adı içindəki dizinlerden birinə axtarış (icra etmə) icazəsinə icazə verilmədi və ya fayl hələ mövcud deyil və üst kataloqa giriş icazəsinə icazə verilmir.

ENAMETOOLONG

yol adı çox uzun idi.

ENOENT

O_CREAT deyil və adlanan fayl yoxdur. Və ya, yol adı bir kataloq komponenti yoxdur və ya dangling bir simvolik link.

ENOTDIR

Yollardaki bir kataloq kimi istifadə olunan bir komponent, əslində, bir qovluq deyil və ya O_DIRECTORY göstərilmişdir və pathname bir qovluq deyildir.

ENXIO

O_NONBLOCK | O_WRONLY müəyyən edilir, adlandırılmış fayl FIFO və heç bir proses fayl oxumaq üçün açıq deyil. Yoxsa fayl xüsusi bir fayldır və heç bir uyğun cihaz yoxdur.

ENODEV

Yol adı bir cihazın xüsusi faylına aiddir və müvafiq cihaz yoxdur. (Bu Linux kernel səhvidir - bu vəziyyətdə ENXIO qaytarılmalıdır.)

EROFS

Yol məlumatı yalnız bir fayl sisteminə aiddir və yazma imkanı tələb edildi.

ETXTBSY

yol adı hazırda yerinə yetirilən bir yürütülebilir görüntüyə aiddir və yazma imkanı tələb olunur.

EFAULT

gedən ünvan məkanı xaricində yol məlumatları .

ELOOP

Yol adını həll etmək üçün çoxlu sembolik linklər rast gəlindi və ya O_NOFOLLOW göstərildi, lakin yol adı simvolik bir link idi.

ENOSPC

Yol adı yaradılıb, lakin yol adı olan cihaz yeni fayl üçün yer qoymur .

ENOMEM

Kernel yaddaşının çatışmazlığı mövcud idi.

EMFILE

Proses artıq faylların maksimum sayına malikdir.

ENFILE

Sistemdə açıq olan faylların ümumi sayına çatıldı.

Uyğun

SVr4, SVID, POSIX, X / OPEN, BSD 4.3 O_NOFOLLOWO_DIRECTORY bayraqları Linux- spesifikdir . Onların təriflərini əldə etmək üçün _GNU_SOURCE makrosunu müəyyən etmək lazımdır.

Məhdudiyyətlər

NFS əsaslı protokolda bir çox infelicities var, digərləri ilə əlaqəli O_SYNCO_NDELAY .

POSIX, O_SYNC , O_DSYNCO_RSYNC bayraqlarına müvafiq olaraq sinxronlaşdırılmış I / O üç fərqli variant təmin edir. Hal-hazırda (2.1.130) bunlar Linux altında sinonimdir.