Линукс Туслах Нээлттэй Суралц

Ерөнхий агуулга

<< Буцах << A HREF = "файл: /usr/include/sys/types.h"> sys / types.h> #include << A HREF = "файл: /usr/include/sys/stat.h"> sys / stat.h> #include << A HREF = "файл: /usr/include/fcntl.h"> fcntl.h> int нээлттэй (const char * pathname , int flags ); int нээлттэй (const char * pathname , int flags , mode_t горим ); int creat (const char * pathname , mode_t горим );

Тодорхойлолт

Open () system call linux командыг файлын тодорхойлогч болгон замыг хөрвүүлэхэд ашигладаг ( унших , бичих гэх мэт дараалсан I / O -д ашиглах жижиг, сөрөг биш бүхэл тоо). Дуудлага амжилттай болоход файлын тодорхойлогч нь тухайн үйл явцын хувьд одоогоор нээгдээгүй хамгийн бага файлын тодорхойлогч байна. Энэ дуудлага нь өөр ямар нэгэн процесстой хуваалцаагүй шинэ нээлттэй файл үүсгэдэг. (Гэхдээ хуваалцсан нээлттэй файлууд салаа (2) системийн дуудлагаар үүсч болно.) Шинэ файлын тодорхойлогч нь гүйцэтгэх функцуудад нээлттэй байхаар тохируулагдсан байдаг ( fcntl (2) -ийг үзнэ үү). Файл офсет нь файлын эхэнд тавигддаг.

Параметрүүдийн тугууд нь O_RDONLY , O_WRONLY эсвэл O_RDWR файлуудын зөвхөн унших, бичихээр эсвэл унших / бичихийн тулд, O bitDD-ийн аль нэгийг эсвэл дараахыг тэг буюу түүнээс их унших хүсэлт гаргасан байна:

O_CREAT

Хэрэв файл байхгүй бол үүнийг үүсгэнэ. Файлын эзэн (хэрэглэгчийн ID) нь үйл явцын хэрэглэгчийн хэрэглэгчийн ID-д тохируулагдсан. Бүлгэмийн эзэмшил (бүлгийн ID) нь процессийн бүлгийн ID дугаар эсвэл parent лавлах бүлгийн ID уруу заагдсан байдаг (файлын системийн төрөл, холболтын тохируулгаас хамаардаг, мөн толгой сангийн лавлах горим, жишээлбэл холболт mount (8) -д тайлбарласны дагуу ext2 файлын системүүдийн сонголтууд bsdgroups болон sysvgroups .

O_EXCL

O_CREAT-д хэрэглэгдэх үед хэрэв файл байгаа бол энэ нь алдаа бөгөөд нээлттэй байх болно. Энэ утгаараа, тэмдэглэгээний холбоос нь хаана байрлаж байгаагаас үл хамааран байдаг. O_EXCL нь NFS файлын системүүд дээр эвдэрсэн, түгжих үүрэг гүйцэтгэхэд зориулагдсан програмууд нь уралдааны нөхцөлийг агуулна. Lockfile ашиглан атомын файлын түгжээг хийх шийдэл нь ижил f (өөрөөр хэлбэл hostname болон pid-г холбох ) өвөрмөц файл үүсгэхийн тулд холбоос файлд холбоос хийх холбоосыг (2) ашиглана. Хэрэв холбоос () 0 эргэж байвал түгжээг амжилттай болгоно. Өөрөөр хэлбэл холбоосын тоо 2-оор нэмэгдэж байгаа эсэхийг шалгахын тулд өвөрмөц файлын стат (2) -ийг ашиглаарай.

O_NOCTTY

Хэрэв зам мөр нь терминалын төхөөрөмжийг хэлдэг бол --- tty (4) -ийг үзээрэй. Энэ нь процесс байхгүй ч процессийн хяналтын терминал болж ирдэггүй.

O_TRUNC

Хэрэв файл аль хэдийн байдаг бөгөөд ердийн файл бөгөөд нээлттэй горим нь бичихийг зөвшөөрдөг (өөрөөр хэлбэл O_RDWR эсвэл O_WRONLY) нь 0-оор уртсах болно. Хэрэв файл нь FIFO эсвэл терминалын төхөөрөмжийн файл бол O_TRUNC тугийг үл тоомсорлодог. Үгүй бол O_TRUNC-ийн нөлөө тодорхойгүй болно. (Олон Линуксын хувилбаруудад энэ нь үл хэрэглэгдэх болно; бусад хувилбарууд дээр алдаа буцаах болно.)

O_APPEND

Файл нээх горимд нээгдсэн байна. Мөр бүрийг бичихийн өмнө файлын заагч файлын төгсгөлд lseek- тэй адил байсан. O_APPEND нь нэгээс илүү процессыг нэг удаа файлд нэмэх боломжтой бол NFS файлын систем дээр эвдэрсэн файлууд руу хүргэж болно. Энэ нь NFS нь файлд нэмэхийг дэмждэггүй тул клиент цөм үүнийг дүрсэлж байх ёстой бөгөөд энэ нь уралдааны нөхцөлгүйгээр хийж чадахгүй.

O_NONBLOCK эсвэл O_NDELAY

Боломжтой бол, файлыг хаалтгүй горимд нээдэг. Буцаасан файлын тодорхойлогч дээрх нээлттэй эсвэл дараагийн үйлдэл нь дуудлага хийх процессыг хүлээх шалтгаан болдог. FIFO (нэртэй хоолой) -ыг боловсруулахын тулд fifo (4) -ийг үзнэ үү. Энэ горим нь FIFO-ээс өөр файлд ямар ч нөлөө үзүүлэхгүй.

O_SYNC

Энэ файл синхрон I / O-д нээгдсэн байна. Үүний үр дүнд файлын тодорхойлогч дээрх бичсэн s нь өгөгдлийг бие даасан тоног төхөөрөмжид бичиж дуустал дуудах процессыг хааж болно. Гэхдээ доорх RESTRICTIONS-г харна уу.

O_NOFOLLOW

Хэрэв зам мөр нь симбол холбоос байвал нээлттэй амжилтгүй болно. Энэ нь Линуксийн 2.1.126 хувилбарт нэмэгдсэн FreeBSD өргөтгөл юм. Замын өмнөх хэсгүүд дэхь симбол холбоосыг дагаж мөрдөх болно. Glibc 2.0.100 болон түүнээс хойшхи толгойн энэ тугны тодорхойлолт; 2.1.126-ийн өмнө цөм нь ашигласан бол үүнийг үл тоомсорлодог .

O_DIRECTORY

Хэрэв pathname нь сан биш бол нээлттэй амжилтгүй болдог. Энэ туг нь Линуксд зориулагдсан бөгөөд 2.1326-ийн кернелийн хувилбарт нэмсэн бөгөөд opendir (3) нь FIFO буюу соронзон хальсан төхөөрөмж дээр дуудагдсан тохиолдолд үйлчилгээ үзүүлэхээс татгалзах асуудлуудаас зайлсхийх боловч opendir- ыг хэрэгжүүлснээс гадна ашиглах ёсгүй. .

O_DIRECT

I / O-ийн кэшийн нөлөөг багасгахыг хичээ. Ерөнхийдөө энэ нь гүйцэтгэлийг доройтуулж болох боловч програмууд өөрийн кэш хийхдээ тусгай нөхцөл байдалд ашигтай байдаг. I / O файл нь хэрэглэгчийн орон зайн буффераас шууд / шууд хийгддэг. I / O нь унших (2) эсвэл бичих (2) системийн дуудлагын төгсгөлд синхрон, өгөгдөл дамжуулагдсан байх ёстой. Шилжүүлгийн хэмжээ, хэрэглэгчийн буфер болон файлын нөхөлтийг зэрэгцүүлэх нь файлын системийн логик хаалтын хэмжээнээс олон байна.
Энэ туг нь Unix-тэй төстэй системүүд дээр дэмжигддэг; дэмжлэг Линукс дээр цөмийн хувилбар 2.4.10-д нэмэгдсэн.
Блок төхөөрөмжүүдийн хувьд ижил төстэй интерфэйс нь түүхий (8) -д тайлбарлагдсан болно.

O_ASYNC

Сигнүүр үүсгэх (анхдагчаар SIGIO-г үүсгэх боловч энэ нь файлын тодорхойлогч дээр оролт эсвэл гаралт боломжтой болсон үед fcntl (2) -ээр) үүнийг өөрчилж болно. Энэ функц нь терминал, псевдо-терминал, сокетуудад зөвхөн боломжтой. Дэлгэрэнгүй мэдээллийг fcntl (2) -с үзнэ үү.

O_LARGEFILE

Том файл системийг дэмждэг 32 битийн систем дээр 31 битийн хэмжээтэй хэмжигдэхүүнүүдийг зөвшөөрөхгүй файлуудыг зөвшөөрнө.

Эдгээр сонголтот тугуудын заримыг fcntl файлыг нээгдсэний дараа өөрчилж болно.

Аргументийн горим нь шинэ файл үүсгэгдсэн тохиолдолд ашиглах зөвшөөрлийг тодорхойлно. Энэ нь ердийн аргаар процессийн umask -аар өөрчлөгдсөн: үүсгэгдсэн файлуудын зөвшөөрлүүд (горим & umask) . Энэ горим нь шинээр үүссэн файлын ирээдүйд хандах үед л хамаарна гэдгийг анхаарна уу; Read-only файл үүсгэдэг нээлттэй дуудлага унших / бичих файлын тодорхойлогчийг буцааж өгч болно.

Дараах симболын тогтмол горимд :

S_IRWXU

00700 хэрэглэгч (файлын эзэмшигч) уншиж, бичиж, ажиллуулах эрхтэй

S_IRUSR (S_IREAD)

00400 хэрэглэгч зөвшөөрлийг уншиж байна

S_IWUSR (S_IWRITE)

00200 хэрэглэгч бичгээр зөвшөөрөл авсан байна

S_IXUSR (S_IEXEC)

00100 хэрэглэгч зөвшөөрсөн байна

S_IRWXG

00070 бүлэг уншиж, бичиж, ажиллуулж байна

S_IRGRP

00040 бүлэг зөвшөөрлийг уншиж байна

S_IWGRP

00020 бүлэг бичсэн зөвшөөрөлтэй

S_IXGRP

00010 бүлэг гүйцэтгэх зөвшөөрөлтэй байна

СИДОВХО

00007 бусад нь уншиж, бичиж, зөвшөөрөл авдаг

ФИРОСО

00004 бусад нь зөвшөөрлийг уншиж байна

S_IWOTH

00002 бусад нь бичгээр зөвшөөрөл авдаг

S_IXOTH

00001 бусад нь гүйцэтгэх зөвшөөрөлтэй байна

O_CREAT тугийг оруулах үед горимыг зааж өгөх ёстой бөгөөд өөрөөр үл тоомсорлодог.

creat creator нь O_CREAT | O_WRONLY | O_TRUNC- тай ижил тугуудыг нээхтэй адил юм.

БУРХАН БҮН

нээлттэй , бүтээсэн тохиолдолд алдаа гарсан тохиолдолд шинэ файлын тодорхойлогчийг буцааж өгнө (хэрэв шаардлагатай бол errno тохируулсан байна). Нээлттэй төхөөрөмжийн тусгай тусгай файлуудыг онгойлгож болно гэдгийг тэмдэглэх боловч creature үүнийг үүсгэж чаддаггүй - харин mknod (2) -ийг ашиглах хэрэгтэй.

NIS файлын систем дээр UID диаграммаар идэвхжсэн үед нээлттэй файлын тодорхойлогчийг буцааж өгч болох боловч read (2) хүсэлтүүд EACCES-ээр татгалздаг . Учир нь клиент нь зөвшөөрлүүдийг шалгах замаар нээлттэй үйл ажиллагаа явуулдаг тул UID-ийн зураглалыг уншиж, бичих хүсэлт дээр сервер гүйцэтгэдэг.

Хэрвээ файл шинээр үүссэн бол түүний цагийн, цаг, mtime талбарууд нь одоогийн цагт тохируулагдана, мөн эцэг эхийн цагийн болон mtime талбарууд байдаг. Үгүй бол, хэрэв файл нь O_TRUNC тугийн улмаас өөрчлөгдсөн бол түүний цагийн болон mtime талбарууд нь одоогийн цагт тохируулагдана.

Алдаа

EEXIST

pathname аль хэдийн орсон байна, O_CREAT болон O_EXCL ашиглаж байна.

EISDIR

pathname нь директор болон хандалтын хүсэлтэнд хандах хүсэлтийг ( O_WRONLY эсвэл O_RDWR тохируулагдсан) хамаарна.

EACCES

Файлд хандах хүсэлтийг зөвшөөрөхгүй эсвэл замнал дахь директоруудын аль нэг нь хайх (зөвшөөрөх) зөвшөөрлийг зөвшөөрдөггүй, эсвэл файл байхгүй байсан бөгөөд эцэг эхэд хандах хандалтыг зөвшөөрдөггүй.

Энаметолонг

Замын нэр хэт урт байна.

ENOENT

O_CREAT тохируулагдаагүй ба нэрлэгдсэн файл байхгүй байна. Эсвэл, pathname дахь лавлах бүрэлдэхүүн байхгүй эсвэл холбох тэмдэглэгээний холбоос юм.

ENOTDIR

Замын сангийн директорт ашигласан бүрэлдэхүүн хэсэг нь үнэндээ биш сан, эсвэл O_DIRECTORY тодорхойлогдсон бөгөөд pathname нь сан биш юм.

ENXIO

O_NONBLOCK | O_WRONLY-г тохируулсан, нэртэй файл нь FIFO бөгөөд унших процесс нь файл нээлттэй байдаггүй. Эсвэл, файл нь төхөөрөмжийн тусгай файл бөгөөд холбогдох төхөөрөмж байхгүй байна.

ENODEV

pathname нь төхөөрөмжийн тусгай файлыг тодорхойлж холбогдох төхөөрөмж байхгүй байна. (Энэ бол Линуксийн цөмийн алдаа юм. Энэ тохиолдолд ENXIO-г буцаах ёстой.)

ЭРСДЭЛ

pathname нь зөвхөн уншигдах файлын систем дээр файлыг зааж хүсэлтийг бичих хүсэлтийг бичдэг.

ETXTBSY

pathname нь одоогоор гүйцэтгэгдэж байгаа гүйцэтгэгдэж байгаа дүрс ба хүсэлт бичих хүсэлтийг бичихийг хэлнэ.

EFAULT

Замын нэр таны хүрч очих хаягийн талбараас гадна харагдана.

ELOOP

Шийдэх арга замд маш олон симбол холбоосууд тулгардаг, эсвэл O_NOFOLLOW тодорхойлогдсон боловч замын нэр нь симбол холбоос байсан.

ENOSPC

pathname -г үүсгэх боловч агуулсан замыг агуулсан төхөөрөмж нь шинэ файлд өрөө байхгүй байна.

ENOMEM

Цөмийн санах ой хангалтгүй байна.

EMFILE

Процесс нь хамгийн ихдээ файл нээгдсэн байна.

ENFILE

Системд нээх файлуудын нийт тоог хязгаарласан байна.

нийцсэн

SVr4, SVID, POSIX, X / OPEN, BSD 4.3 O_NOFOLLOW болон O_DIRECTORY тугнууд нь Линуксд зориулагдсан байдаг. Тэдгээр тодорхойлолтуудыг авахын тулд _GNU_SOURCE макроийг тодорхойлох хэрэгтэй байж магадгүй.

Хязгаарлалт

NFS-ийн үндсэн протокол дээр алдаа гардаг , O_SYNC болон O_NDELAY бусад хүмүүст нөлөөлдөг.

POSIX нь O_SYNC , O_DSYNC болон O_RSYNC тугуудын харгалзах I / O синхрончлогдсон 3 хувилбартай. Одоогоор (2.1.130) эдгээр бүгд бүгдээрээ Линуксд ижил утгатай.