រៀនពាក្យបញ្ជាលីនុចបើក

សង្ខេប

#include << A HREF = "file: /usr/include/sys/types.h"> sys / types.h> #include << A HREF = "file: /usr/include/sys/stat.h"> sys / stat.h> #include << A HREF = "file: /usr/include/fcntl.h"> fcntl.h> int open (const char * pathname , int flags ); int open (const char * pathname , int flags , mode_t mode ); int creation (const char * pathname របៀប mode_t );

ការពិពណ៌នា

ពាក្យបញ្ជា ប្រព័ន្ធ បើកចំហ () ពាក្យបញ្ជា linux ត្រូវបានប្រើដើម្បីបម្លែងឈ្មោះផ្លូវទៅជាកម្មវិធីពិពណ៌នាឯកសារ (តូចតូចលេខអវិជ្ជមានសម្រាប់ប្រើក្នុង I / O ជាបន្តបន្ទាប់ជាមួយនឹង អាន សរសេរ ។ ល។ ) ។ នៅពេលការហៅបានជោគជ័យអ្នកពិពណ៌នា ឯកសារដែលបាន ត្រឡប់នឹងក្លាយជាកម្មវិធីពិពណ៌នាឯកសារទាបបំផុតដែលមិនបើកដំណើរការសម្រាប់ដំណើរការនេះ។ ការហៅនេះបង្កើតឯកសារបើកថ្មីមិនត្រូវបានចែករំលែកជាមួយដំណើរការផ្សេងទៀតទេ។ (ប៉ុន្តែឯកសារបើកចំហដែលបានចែករំលែកអាចកើតឡើងតាមរយៈការហៅប្រព័ន្ធ ហ្វា (2) ។ ) កម្មវិធីពិពណ៌នាឯកសារថ្មីត្រូវបានកំណត់ឱ្យបើកដំណើរការនៅលើអនុគមន៍ exec (សូមមើល fcntl (2)) ។ ឯកសារអុហ្វសិតត្រូវបានកំណត់ទៅជាដំបូងនៃឯកសារ។

ទង់ ប៉ារ៉ាម៉ែត្រគឺជា O_RDONLY , O_WRONLYO_RDWR ដែលស្នើសុំបើកឯកសារបានតែអានតែសរសេរឬអាន / សរសេររៀងៗខ្លួនអញ្ចឹង - 'd ដោយសូន្យឬច្រើនជាងនេះដូចខាងក្រោម:

O_CREAT

ប្រសិនបើឯកសារមិនមានវានឹងត្រូវបានបង្កើត។ ម្ចាស់ (លេខសម្គាល់អ្នកប្រើ) នៃឯកសារត្រូវបានកំណត់ទៅលេខសម្គាល់អ្នកប្រើដែលមានប្រសិទ្ធិភាពនៃដំណើរការ។ ភាពជាម្ចាស់ក្រុម (លេខសម្គាល់ក្រុម) ត្រូវបានកំណត់ទៅលេខសម្គាល់ក្រុមដែលមានប្រសិទ្ធិភាពនៃដំណើរការឬទៅលេខសម្គាល់ក្រុមនៃថតមេ (អាស្រ័យលើប្រភេទប្រព័ន្ធឯកសារនិងជម្រើសម៉ោននិងរបៀបនៃថតមេមើលឧ។ ម៉ោន។ ជម្រើស bsdgroups និង sysvgaps នៃប្រព័ន្ធឯកសារ ext2 ដូចបានរៀបរាប់ក្នុង ម៉ោន (8)) ។

O_EXCL

នៅពេលប្រើជាមួយ O_CREAT ប្រសិនបើឯកសារមានរួចហើយវាគឺជាកំហុសហើយការ បើក នឹងបរាជ័យ។ នៅក្នុងបរិបទនេះតំណនិមិត្តសញ្ញាមួយមានវត្តមាន, ដោយមិនគិតពីកន្លែងដែលចំណុចរបស់វា។ O_EXCL ត្រូវបានខូចនៅលើ ប្រព័ន្ធឯកសារ NFS កម្មវិធីដែលពឹងផ្អែកលើវាដើម្បីអនុវត្តភារកិច្ចចាក់សោនឹងមានលក្ខខណ្ឌប្រណាំងមួយ។ ដំណោះស្រាយសម្រាប់ដំណើរការឯកសារអាតូមដោយប្រើឯកសារជាប់សោគឺបង្កើតឯកសារតែមួយគត់នៅលើ fs ដូចគ្នា (ឧ។ បញ្ចូលឈ្មោះម៉ាស៊ីននិងភីឌី) ប្រើ តំណ (2) ដើម្បីបង្កើតតំណភ្ជាប់ទៅឯកសារជាប់សោ។ ប្រសិនបើ ភ្ជាប់ () ត្រឡប់ 0 នោះសោនេះទទួលបានជោគជ័យ។ បើមិនដូច្នោះទេត្រូវប្រើ stat (2) លើឯកសារតែមួយគត់ដើម្បីពិនិត្យមើលថាតើការរាប់តំណរបស់វាបានកើនឡើងដល់ 2 ឬយ៉ាងណា, ក្នុងករណីដែលសោបានជោគជ័យ។

O_NOCTTY

ប្រសិនបើ ឈ្មោះផ្លូវ សំដៅទៅលើឧបករណ៍ស្ថានីយ --- សូមមើល tty (4) --- វានឹងមិនក្លាយជាស្ថានីយត្រួតពិនិត្យដំណើរការទេទោះបីជាដំណើរការមិនមានក៏ដោយ។

O_TRUNC

ប្រសិនបើឯកសារមានរួចហើយនិងជាឯកសារធម្មតាហើយរបៀបបើកដំណើរការអនុញ្ញាតឱ្យសរសេរ (ឧ។ O_RDWR ឬ O_WRONLY) វានឹងត្រូវបានកាត់ត្រឹមប្រវែង 0. ប្រសិនបើឯកសារជាឯកសារឧបករណ៍ FIFO ឬឧបករណ៍ស្ថានីយទង់ O_TRUNC ត្រូវបានមិនអើពើ។ បើមិនដូច្នោះទេឥទ្ធិពលនៃ O_TRUNC មិនត្រូវបានបញ្ជាក់។ (នៅលើ កំណែ លីនុចជាច្រើនវានឹងមិនត្រូវបានអើពើនៅលើកំណែផ្សេងទៀតវានឹងត្រឡប់កំហុសមួយ។ )

O_APPEND

ឯកសារត្រូវបានបើកនៅក្នុងរបៀបបន្ថែម។ មុនពេល សរសេរ នីមួយៗចង្អុលឯកសារត្រូវបានដាក់នៅខាងចុងឯកសារដូចជាជាមួយនឹង lseekO_APPEND អាចនាំឱ្យមានឯកសារខូចនៅលើប្រព័ន្ធឯកសារ NFS ប្រសិនបើដំណើរការច្រើនជាងមួយបញ្ចូលទិន្នន័យទៅឯកសារក្នុងពេលតែមួយ។ នេះដោយសារតែ NFS មិនគាំទ្រការបន្ថែមទៅឯកសារនោះដូច្នេះខឺណែលម៉ាស៊ីនត្រូវក្លែងធ្វើវាដែលមិនអាចធ្វើបានដោយគ្មានលក្ខខណ្ឌប្រណាំង។

O_NONBLOCKO_NDELAY

នៅពេលអាចធ្វើបានឯកសារត្រូវបានបើកនៅក្នុងរបៀបដែលមិនរារាំង។ ទាំងការ បើកចំហរ និងប្រតិបត្ដិការជាបន្តបន្ទាប់នៅលើកម្មវិធីពិពណ៌នាឯកសារដែលត្រូវបានត្រឡប់មកវិញនឹងធ្វើឱ្យដំណើរការហៅទូរស័ព្ទដើម្បីរង់ចាំ។ ចំពោះការគ្រប់គ្រង FIFOs (បំពង់ដែលមានឈ្មោះ) សូមមើលផងដែរ FIFO (4) ។ របៀបនេះមិនចាំបាច់មានឥទ្ធិពលលើឯកសារផ្សេងក្រៅពី FIFOs ទេ។

O_SYNC

ឯកសារត្រូវបានបើកសម្រាប់ I / O ដែលមានសមកាលកម្ម។ រាល់ការ សរសេរ លើប្រព័ន្ធពិពណ៌នាឯកសារលទ្ធផលនឹងរារាំងដំណើរការហៅទូរស័ព្ទរហូតទាល់តែទិន្នន័យត្រូវបានសរសេរទៅផ្នែករឹងមូលដ្ឋាន។ សូមមើល RESTRICTIONS ខាងក្រោម, ទោះបីជា។

O_NOFOLLOW

ប្រសិនបើ ឈ្មោះផ្លូវ គឺជាតំណនិមិត្តសញ្ញានោះការបើកចំហរបរាជ័យ។ នេះគឺជាផ្នែកបន្ថែម FreeBSD ដែលត្រូវបានបន្ថែមទៅ Linux នៅក្នុងកំណែ 2.1.126 ។ តំណនិមិត្តសញ្ញានៅក្នុងសមាសធាតុមុនរបស់ឈ្មោះផ្លូវនឹងនៅតែត្រូវបានអនុវត្ត។ បឋមកថាពី glibc 2.0.100 និងក្រោយមករួមបញ្ចូលនិយមន័យនៃទង់ជាតិនេះ; ខឺណែលមុន 2.1.126 នឹងមិនអើពើវាបើប្រើ

O_DIRECTORY

ប្រសិនបើ ឈ្មោះផ្លូវ មិនមែនជាថត, បណ្តាលឱ្យបរាជ័យបើក។ ទង់នេះគឺជាលីនុចជាក់លាក់ហើយត្រូវបានបន្ថែមនៅក្នុងកំណែខឺណែល 2.1.126 ដើម្បីជៀសវាងបញ្ហានៃការបដិសេធនៃបញ្ហាប្រសិនបើ opendir (3) ត្រូវបានហៅលើឧបករណ៍ FIFO ឬកាសែតប៉ុន្តែមិនគួរត្រូវបានប្រើខាងក្រៅការអនុវត្តកម្មវិធី។ ។

O_DIRECT

សូមព្យាយាមបង្រួមអប្បបរមានៃផលប៉ះពាល់នៃឃ្លាំងសម្ងាត់ I / O ទៅនិងពីឯកសារនេះ។ ជាទូទៅវានឹងបន្ថយការសម្តែងប៉ុន្តែវាមានប្រយោជន៍ក្នុងស្ថានភាពពិសេសដូចជាពេលកម្មវិធីដំណើរការឃ្លាំងសម្ងាត់ផ្ទាល់ខ្លួន។ ឯកសារ I / O ត្រូវបានធ្វើដោយផ្ទាល់ទៅ / ពីសតិបណ្តោះអាសន្នរបស់អ្នកប្រើ។ I / O គឺជាការធ្វើសមកាលកម្មពោលគឺនៅពេលបញ្ចប់នៃការហៅទូរស័ព្ទការ អាន (2) ឬ សរសេរ (2) ទិន្នន័យត្រូវបានធានាថាត្រូវបានផ្ទេរ។ ទំហំផ្ទេរនិងតម្រឹមនៃសតិបណ្តោះអាសន្នរបស់អ្នកប្រើនិងអុហ្វសិតឯកសារត្រូវតែជាពហុគុណនៃទំហំប្លុកឡូជីខលនៃប្រព័ន្ធឯកសារ។
ទង់នេះត្រូវបានគាំទ្រលើប្រព័ន្ធមួយចំនួនដូចជាយូនីក។ ការគាំទ្រត្រូវបានបន្ថែមនៅក្រោម Linux ក្នុងកំណែខឺណែល 2.4.10 ។
ចំណុចប្រទាក់ស្រដៀងគ្នាសម្រាប់ semantically ឧបករណ៍ប្លុកត្រូវបានពិពណ៌នានៅក្នុង វត្ថុធាតុដើម (8) ។

O_ASYNC

បង្កើតសញ្ញា (SIGIO តាមលំនាំដើមប៉ុន្តែវាអាចត្រូវបានផ្លាស់ប្ដូរតាមរយៈ fcntl (2)) ពេលបញ្ចូលឬទិន្នផលអាចមាននៅលើកម្មវិធីពិពណ៌នាឯកសារនេះ។ លក្ខណៈពិសេសនេះអាចប្រើបានសម្រាប់ស្ថានីយសេះប្រញាយនិងរន្ធ។ សូមមើល fcntl (2) សម្រាប់ព័ត៌មានបន្ថែម។

O_LARGEFILE

នៅលើប្រព័ន្ធ 32 ប៊ីតដែលគាំទ្រប្រព័ន្ធឯកសារធំអនុញ្ញាតឱ្យឯកសារដែលទំហំរបស់វាមិនអាចត្រូវបានតំណាងនៅក្នុង 31 ប៊ីតត្រូវបានបើក។

ទង់ជម្រើសមួយចំនួនទាំងនេះអាចត្រូវបានប្តូរដោយប្រើ fcntl បន្ទាប់ពីឯកសារត្រូវបានបើក។

របៀប អាគុយម៉ង់បញ្ជាក់សិទ្ធិដើម្បីប្រើក្នុងករណីឯកសារថ្មីត្រូវបានបង្កើត។ វាត្រូវបានកែប្រែដោយ umask របស់ដំណើរការក្នុងវិធីធម្មតា: សិទ្ធិរបស់ឯកសារដែលបានបង្កើតគឺ (របៀប & umask) ។ ។ ចំណាំថារបៀបនេះអនុវត្តចំពោះការចូលដំណើរការពេលក្រោយនៃឯកសារដែលបានបង្កើតថ្មីៗប៉ុណ្ណោះ & # 160; ។ ការហៅ បើក ដែលបង្កើតឯកសារបានតែអានអាចត្រឡប់កម្មវិធីពិពណ៌នាឯកសារអាន / សរសេរ។

ថេរនិមិត្តសញ្ញាដូចខាងក្រោមត្រូវបានផ្ដល់សម្រាប់ របៀប :

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 ក្រុមបានអនុញ្ញាតិ

S_IRWXO

00007 អ្នកផ្សេងទៀតបានអានការអនុញ្ញាតនិងការអនុញ្ញាត

S_IROTH

00004 អ្នកផ្សេងទៀតបានអានការអនុញ្ញាត

S_IWOTH

00002 មានសិទ្ធិសរសេរ

S_IXOTH

00001 ផ្សេងៗទៀតបានប្រតិបត្តិ

របៀប ត្រូវបានបញ្ជាក់នៅពេល O_CREAT ស្ថិតនៅក្នុង ទង់ជាតិ ហើយត្រូវបានមិនអើពើបើមិនដូច្នេះទេ។

creat គឺស្មើទៅនឹង បើក ជាមួយ ទង់ជាតិដែល ស្មើ O_CREAT | O_WRONLY | O_TRUNC

ត្រឡប់មកវិញ VALUE

បើក និង បង្កើត ត្រឡប់កម្មវិធីពិពណ៌នាឯកសារថ្មីឬ -1 ប្រសិនបើកំហុសបានកើតឡើង (ក្នុងករណីណា errno ត្រូវបានកំណត់ឱ្យបានត្រឹមត្រូវ) ។ ចំណាំថាការ បើកចំហ អាចបើកឯកសារពិសេសឧបករណ៍ប៉ុន្តែការ បង្កើត មិនអាចបង្កើតវាបានទេ - ប្រើ mknod (2) ជំនួសវិញ។

នៅលើប្រព័ន្ធឯកសារ NFS ដែលបានបើកការធ្វើផែនទី UID បើក អាចត្រឡប់កម្មវិធីពិពណ៌នាឯកសារប៉ុន្តែឧទាហរណ៍ការ អាន (2) ត្រូវបានបដិសេធដោយ EACCES ។ នេះគឺដោយសារតែម៉ាស៊ីនភ្ញៀវដំណើរការដោយការត្រួតពិនិត្យសិទ្ធិប៉ុន្តែការធ្វើផែនទី UID ត្រូវបានអនុវត្តដោយម៉ាស៊ីនបម្រើនៅពេលដែលសំណើសរសេរនិងសរសេរ។

ប្រសិនបើឯកសារត្រូវបានបង្កើតថ្មីវាលពេលវេលា, ពេលវេលា, វាលពេលវេលារបស់វាត្រូវបានកំណត់ទៅពេលបច្ចុប្បន្ននិងដូច្នេះគឺវាលពេលវេលា ctime និង mtime នៃថតមេ។ បើមិនដូច្នោះទេប្រសិនបើឯកសារត្រូវបានកែប្រែដោយសារតែទង់ O_TRUNC វាលពេលវេលានិងពេលវេលារបស់វាត្រូវបានកំណត់នៅបច្ចុប្បន្ន។

កំហុស

អាមេរិច

ឈ្មោះផ្លូវ មានរួចហើយហើយ O_CREAT និង O_EXCL ត្រូវបានប្រើ។

EISDIR

ឈ្មោះផ្លូវគឺ សំដៅទៅលើថតហើយការចូលដំណើរការត្រូវបានស្នើសុំដែលពាក់ព័ន្ធ (នោះគឺ O_WRONLYO_RDWR ត្រូវបានកំណត់) ។

EACCES

ការចូលទៅឯកសារដែលបានស្នើសុំមិនត្រូវបានអនុញ្ញាតឬថតមួយក្នុងបញ្ជី ឈ្មោះផ្លូវ មិនអនុញ្ញាតការអនុញ្ញាតស្វែងរកឬឯកសារមិនទាន់មានហើយសិទ្ធិសរសេរទៅថតមេមិនអនុញ្ញាតទេ។

ENAMETOOLONG

ឈ្មោះផ្លូវ វែងពេក។

សូមជូនពរ

O_CREAT មិនត្រូវបានកំណត់ហើយឯកសារដែលមានឈ្មោះមិនមានទេ។ ឬសមាសភាគថតនៅក្នុង ឈ្មោះផ្លូវ មិនមានឬជាតំណនិមិត្តសញ្ញា dangling ។

ENOTDIR

សមាសធាតុដែលត្រូវបានប្រើជាថតនៅក្នុង ឈ្មោះផ្លូវ មិនមែនជាការពិតថតឬ O_DIRECTORY ត្រូវបានបញ្ជាក់ហើយ ឈ្មោះផ្លូវ មិនមែនជាថតទេ។

ENXIO

O_NONBLOCK | O_WRONLY ត្រូវបានកំណត់ឯកសារដែលមានឈ្មោះថា FIFO ហើយដំណើរការគ្មានឯកសារបើកសម្រាប់ការអានទេ។ ឬឯកសារគឺជាឯកសារពិសេសឧបករណ៍ហើយគ្មានឧបករណ៍ដែលត្រូវគ្នាទេ។

ENODEV

ឈ្មោះផ្លូវគឺ សំដៅទៅលើឯកសារពិសេសរបស់ឧបករណ៍ហើយគ្មានឧបករណ៍ដែលត្រូវគ្នា។ (នេះជាកំហុសខឺណែលលីនុច - ក្នុងករណីនេះ ENXIO ត្រូវតែត្រឡប់មកវិញ។ )

EROFS

ឈ្មោះផ្លូវគឺ សំដៅលើឯកសារនៅលើប្រព័ន្ធឯកសារបានតែអានហើយការសរសេរត្រូវបានស្នើ។

ETXTBSY

ឈ្មោះផ្លូវគឺ សំដៅទៅលើរូបភាពដែលអាចប្រតិបត្តិបានដែលបច្ចុប្បន្នកំពុងត្រូវបានប្រតិបត្តិហើយការសរសេរត្រូវបានស្នើ។

EFAULT

ចំណុចដៅ ឈ្មោះផ្លូវ នៅខាងក្រៅកន្លែងអសយដ្ឋានរបស់អ្នក។

ELOOP

តំណនិមិត្តសញ្ញាច្រើនត្រូវបានជួបប្រទះក្នុងការដោះស្រាយ ឈ្មោះផ្លូវO_NOFOLLOW ត្រូវបានបញ្ជាក់ប៉ុន្តែ ឈ្មោះផ្លូវ គឺជាតំណនិមិត្តសញ្ញា។

ENOSPC

ឈ្មោះផ្លូវ ត្រូវបានបង្កើតប៉ុន្តែឧបករណ៍ដែលមានឈ្មោះ ផ្លូវ មិនមានបន្ទប់សម្រាប់ឯកសារថ្មីទេ។

ENOMEM

មិនមានសតិខឺណែលគ្រប់គ្រាន់។

EMFILE

ដំណើរការមានចំនួនអតិបរមានៃឯកសារបើក។

ENFILE

ដែនកំណត់លើចំនួនឯកសារសរុបដែលបើកនៅលើប្រព័ន្ធត្រូវបានឈានដល់។

ការអនុលោមទៅ

SVR4, SVID, POSIX, X / OPEN, BSD 4.3 ទង់ O_NOFOLLOW និង O_DIRECTORY មានលក្ខណៈពិសេសរបស់ លីនុច ។ មួយអាចត្រូវកំណត់ម៉ាក្រូ _GNU_SOURCE ដើម្បីទទួលបាននិយមន័យរបស់វា។

ការរឹតត្បិត

មាន infelicities ជាច្រើននៅក្នុងពិធីការដែលមានមូលដ្ឋាន NFS ដែលប៉ះពាល់ក្នុងចំណោម O_SYNC និង O_NDELAY

POSIX ផ្តល់ជូននូវវ៉ារ្យង់ចំនួនបីខុសគ្នានៃ I / O ដែលបានធ្វើសមកាលកម្មដែលត្រូវគ្នាទៅនឹងទង់ O_SYNC , O_DSYNC និង O_RSYNC ។ បច្ចុប្បន្ន (2.1.130) ទាំងអស់នេះសុទ្ធតែមានន័យដូចគ្នាលីនុច។