სინოფსისი
# მოიცავს << HREF = "ფაილი: /usr/include/sys/types.h"> sys / types.h> # მოიცავს << HREF = "ფაილი: /usr/include/sys/stat.h"> sys / stat.h> # მოიცავს << 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 რეჟიმი );აღწერა
ღია () სისტემური ზარის linux ბრძანება გამოიყენება ფაილების დესკტოპად ფაილური დეფლექტორატისთვის (მცირე, არაგაბარიტული რიცხვი შემდგომი I / O- ში წაკითხვის , ჩაწერის და ა.შ.) გამოყენებისათვის. როდესაც ზარი წარმატებულია, ფაილის დეფლექტორი დაუბრუნდა ყველაზე დაბალი ფაილის დეციპერს, რომელიც არ არის გახსნილი პროცესისთვის. ეს ზარი ქმნის ახალ ღია ფაილს და არ იზიარებს ნებისმიერ სხვა პროცესს. (მაგრამ ღია ფაილები შეიძლება წარმოიშვას ჩანგალი (2) სისტემური ზარის საშუალებით). ახალი ფაილის დეფლექტორი არის მითითებული ფუნქციების გასაკეთებლად (იხ. Fcntl (2)). ფაილის ოფსეტური დადგენილია ფაილის დაწყებისას.
პარამეტრის დროშები არის O_RDONLY , O_WRONLY ან O_RDWR, რომელიც მოითხოვს ფაილის გახსნას მხოლოდ წაუკითხეთ, ჩაწერეთ მხოლოდ ან წაიკითხეთ / ჩაწერეთ bitwise- ან 'd' ან ნულოვანი ან მეტი:
O_CREAT
თუ ფაილი არ არსებობს, შეიქმნება. ფაილის მფლობელი (მომხმარებლის ID) დაყენებულია პროცესის ეფექტური მომხმარებლის ID- ში. ჯგუფის საკუთრების (ჯგუფი ID) დაყენებულია პროცესის ეფექტური ჯგუფის ID ან მშობლის დირექტორიაში ჯგუფის ID (ფაილური სისტემის ტიპზე და მთაზე პარამეტრების მიხედვით და მშობლის დირექტორიაში რეჟიმი, იხ. პარამეტრები bsdgroups და sysvg ჯგუფების ext2 ფაილური სისტემის, როგორც აღწერილია მთაზე (8)).
O_EXCL
როდესაც გამოიყენება O_CREAT- ით , თუ ფაილი უკვე არსებობს, ეს შეცდომაა და ღია იქნება. ამ კონტექსტში სიმბოლური ბმული არსებობს, მიუხედავად იმისა, თუ სად არის მისი ქულები. O_EXCL გაფუჭდება NFS ფაილური სისტემებით , პროგრამები, რომლებიც მასზე დამოკიდებულნი არიან საკეტი ამოცანების შესასრულებლად. ლოკალურ ფაილის გამოყენებით ატომური ფაილების ჩაკეტვის გამოსავალი არის უნიკალური ფაილის შექმნა იგივე ფაილზე (მაგ., ჰოსტის სახელი და PIN), გამოიყენეთ ბმული (2) ლოკალურ ფაილთან კავშირისთვის. თუ ბმული () დააბრუნებს 0, დაბლოკვა წარმატებულია. წინააღმდეგ შემთხვევაში, გამოიყენეთ stat (2) უნიკალური ფაილის შესამოწმებლად, თუ მისი ბმული რაოდენობა 2-მდე გაიზარდა, ამ შემთხვევაში ჩაკეტვა წარმატებულია.
O_NOCTTY
თუ გზავნილს ტერმინალის მოწყობილობაზე მიუთითებს --- იხ. Tty (4) --- ის პროცესის მაკონტროლებელი ტერმინალიც კი არ გახდება, თუ პროცესი არ გააჩნია.
O_TRUNC
თუ ფაილი უკვე არსებობს და არის რეგულარული ფაილი და ღია რეჟიმი საშუალებას იძლევა წერა (ანუ O_RDWR ან O_WRONLY), ეს იქნება გაანგარიშება სიგრძე 0. თუ ფაილი არის FIFO ან ტერმინალის მოწყობილობის ფაილი, O_TRUNC დროშა იგნორირებულია. წინააღმდეგ შემთხვევაში, O_TRUNC- ის ეფექტი არ არის დაზუსტებული. (ბევრ Linux ვერსიაზე ის იგნორირებული იქნება, სხვა ვერსიებზე კი შეცდომას დააბრუნებს.)
O_APPEND
ფაილი გაიხსნა append რეჟიმში. თითოეული დაწერის დაწყებამდე, ფაილის კურსორი მდგომარეობს დასასრულს ფაილის, თითქოს lseek . O_APPEND შეიძლება გამოიწვიოს დაზიანებული ფაილები NFS ფაილ სისტემებზე, თუ ერთზე მეტი პროცესი ერთდროულად აწვდის ფაილის ერთდროულ მონაცემს. ეს იმიტომ ხდება, რომ NFS მხარს არ უჭერს ფაილის დამატებას, ამიტომ კლიენტის ბირთვი უნდა შეიმუშაოს იგი, რომელიც არ შეიძლება გაკეთდეს რბოლის გარეშე.
O_NONBLOCK ან O_NDELAY
როდესაც შესაძლებელია, ფაილი გაიხსნა არასამთავრობო ბლოკირების რეჟიმში. არც ღია და არც მომდევნო ოპერაციები ფაილის დეფისიორზე, რომელიც დაბრუნდა, გამოიწვევს დარეკვის პროცესს დაველოდოთ. FIFO- ების (სახელწოდებით მილების) გატარებისათვის, აგრეთვე იხილე fifo (4). ამ რეჟიმს არ უნდა ჰქონდეს რაიმე ეფექტი FIFO- ს გარდა.
O_SYNC
ფაილი გაიხსნა სინქრონული I / O. ნებისმიერი ჩაწერის შესახებ, რის შედეგადაც ფაილების დესკრიპტორი დაბლოკავს პროცესის დაბლოკვას, სანამ მონაცემები ფიზიკურად ჩაწერილი არ არის. იხილეთ ქვემოთ მოყვანილი შეზღუდვები.
O_NOFOLLOW
თუ გზავნილი სიმბოლური ბმულია, მაშინ ღია არ არის. ეს არის FreeBSD გაფართოება, რომელიც დაემატა Linux- ს 2.1.126 ვერსიაში. სიმბოლური ბმულები პაპკის ადრეულ კომპონენტებში კვლავ მოჰყვება. Glibc 2.0.100-ის სათაურები და მოგვიანებით მოიცავს ამ დროშის განმარტებას; კერნელი ადრე 2.1.126-ის იგნორირებას მოახდენს .
O_DIRECTORY
თუ გზავნილის არ არის დირექტორია, გამოიწვიოს ღია ვერ. ეს დროშაა Linux- ის სპეციფიკიდან და დაემატა kernel version 2.1.126, რათა თავიდან იქნეს აცილებული მომსახურების გაუქმება, თუ ოპენდერი (3) ეწოდება FIFO- ს ან ფირზე მოწყობილობას, მაგრამ არ უნდა იქნას გამოყენებული ოპენდადის .
O_DIRECT
სცადეთ მინიმუმამდე დავამყაროთ I / O- ის კეშის ეფექტები და ამ ფაილში. ზოგადად ეს ხელს უშლის შესრულებას, მაგრამ ეს სასარგებლოა განსაკუთრებულ შემთხვევებში, მაგალითად, როდესაც აპლიკაციები საკუთარი ქეშირების საშუალებას იძლევა. ფაილი I / O კეთდება პირდაპირ / მომხმარებლის სივრცის ბუფერიდან. I / O სინქრონულია, ანუ წაკითხვის (2) დასრულების ან სისტემის (2) სისტემის ზარის დასრულებისას, მონაცემები გარანტირებულია გადაცემული. გადარიცხვა ზომები და მომხმარებლის ბუფერული და ფაილის ოფსეტური განლაგება უნდა იყოს ფაილური სისტემის ლოგიკური ბლოკის ზომა.
ეს დროშა მხარს უჭერს რიგი Unix- ის სისტემებს; მხარდაჭერა დაემატა Linux- ს კერნელი ვერსია 2.4.10.
სემანტიკურად მსგავსი ინტერფეისი ბლოკის მოწყობილობებისთვის აღწერილია ნედლეულში (8).
O_ASYNC
გენერირება სიგნალი (SIGIO- ს მიერ, მაგრამ ეს შეიძლება შეიცვალოს fcntl- ით (2)), როდესაც შეყვანის ან გამომავალი ხდება ამ ფაილის დეციპტორში . ეს ფუნქცია ხელმისაწვდომია მხოლოდ ტერმინალების, ფსევდო-ტერმინალების და სოკეტებისთვის. იხილეთ fcntl (2) დამატებითი ინფორმაციისთვის.
O_LARGEFILE
32-ბიტიანი სისტემები, რომლებიც მხარს უჭერენ მსხვილ ფაილურ სისტემას, საშუალებას მისცემს ფაილებს, რომელთა ზომები არ შეიძლება წარმოდგენილი იყოს 31 ბიტიში.
ზოგიერთი ამგვარი ფლაგმანი შეიძლება შეიცვალოს fcntl- ის ფაილის გახსნის შემდეგ.
არგუმენტის რეჟიმი განსაზღვრავს ნებართვას, ახალი ფაილის შექმნის შემთხვევაში. იგი შეცვლილია პროცესის umask ჩვეულ რეჟიმში: შეიქმნა ფაილების ნებართვა (რეჟიმი და ~ umask) . გაითვალისწინეთ, რომ ეს რეჟიმი გამოიყენება მხოლოდ ახლად შექმნილი ფაილის მომავალი წვდომით; ღია ზარი, რომელიც ქმნის წაკითხული მხოლოდ ფაილის შეიძლება დაბრუნდეს წაკითხვის / ჩაწერის ფაილი descriptor.
შემდეგი სიმბოლური მუდმივები მოცემულია რეჟიმში :
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 თუ შეცდომა მოხდა (ასეთ შემთხვევაში, მცდარია მითითებული). გაითვალისწინეთ, რომ გახსენით გახსნილი სპეციალური ფაილები, მაგრამ კრეატს ვერ შექმნის მათ - გამოიყენეთ mknod (2) ნაცვლად.
NFS ფაილური სისტემების UID რუკების ჩართვა საშუალებას იძლევა, გახსენით ფაილის დეფლექტორი, მაგრამ წაიკითხავს (2) მოთხოვნებს EACCES- ით . ეს იმიტომ, რომ კლიენტი ახორციელებს გახსნას ნებართვების შემოწმებისას, მაგრამ UID რუკების შესრულება ხდება სერვერის მიერ წაკითხვისა და დაწერის მოთხოვნის საფუძველზე.
თუ ფაილი ახლადშექმნილია, მისი დროით, ცემით, mtime სფეროები დაყენებულია მიმდინარე დროში და ასე არიან carent და mimes სფეროებში მშობელი დირექტორია. წინააღმდეგ შემთხვევაში, თუ ფაილი შეცვლილია O_TRUNC- ის დროშით, მისი დრო და mtime ველი დროშია მითითებული.
შეცდომები
EEXIST
pathname უკვე არსებობს და O_CREAT და O_EXCL იქნა გამოყენებული.
EISDIR
pathname ეხება დირექტორიაში და ხელმისაწვდომობის მოთხოვნილი ჩართული წერილობით (ანუ, O_WRONLY ან O_RDWR არის).
EACCES
ფაილზე მოთხოვნილი წვდომა არ არის ნებადართული, ან პატაკის ერთ-ერთი დირექტორია არ იძლევა ძებნის (შესრულების) ნებართვას, ან ფაილი ჯერ არ არსებობს და მშობლის დირექტორიაზე წვდომის უფლება არ არის დაშვებული.
ENAMETOOLONG
გზა ძალიან გრძელია.
ENOENT
O_CREAT არ არის დაყენებული და დასახელებული ფაილი არ არსებობს. ან, დირექტორიაში კომპონენტის სახელი არ არსებობს ან არის dangling სიმბოლური ბმული.
ENOTDIR
კომპონენტი, რომელიც გამოიყენება როგორც დირექტორიაში, არ არის, ფაქტობრივად, დირექტორიაში ან O_DIRECTORY მითითებული და პატაკი არ იყო დირექტორია.
ენქსიო
O_NONBLOCK | O_WRONLY არის მითითებული, დაასახელა ფაილი FIFO და პროცესი არ აქვს ფაილი ღიაა კითხულობს. ან, ფაილი არის მოწყობილობა სპეციალური ფაილი და არ არსებობს შესაბამისი მოწყობილობა.
ENODEV
pathname ეხება მოწყობილობა სპეციალურ ფაილს და არ არსებობს შესაბამისი მოწყობილობა. (ეს არის Linux kernel bug - ამ სიტუაციაში ENXIO უნდა დაბრუნდეს.)
EROFS
pathname ეხება ფაილის წაკითხვის მხოლოდ ფაილური სისტემის შესახებ და ჩაწერის მოთხოვნა იყო.
ETXTBSY
pathname ეხება შესრულების იმიჯს, რომელიც ამჟამად მიმდინარეობს შესრულებული და მოითხოვება წვდომის წვდომა.
EFAULT
თქვენი მისამართების სივრცის გარეთ მდებარე გზა
ELOOP
ბევრი სიმბოლური ბილიკი დაფიქსირდა გზავნილის გადასაჭრელად, ან O_NOFOLLOW მითითებული იყო, მაგრამ გზავნილი სიმბოლური ბმული იყო.
ENOSPC
სახელი უნდა შეიქმნას, მაგრამ მოწყობილობის შემცველი მოწყობილობა არ შეიცავს ახალ ფაილს.
ENOMEM
არასაკმარისი ბირთვის მეხსიერება შესაძლებელი იყო.
EMFILE
პროცესი უკვე გახსნილია ფაილების მაქსიმალური რაოდენობა.
ENFILE
მიღწეულია სისტემაში არსებული ფაილების საერთო რაოდენობის ლიმიტი.
შეესაბამება
SVr4, SVID, POSIX, X / OPEN, BSD 4.3 O_NOFOLLOW და O_DIRECTORY დროშები არიან Linux- ს . შესაძლოა, განისაზღვროს _GNU_SOURCE მაკრო მათი განმარტების მისაღებად.
შეზღუდვები
NFS- ს ძირითად ოქმში ბევრი infelicity არსებობს, რომლებიც გავლენას ახდენენ O_SYNC და O_NDELAY- ს შორის .
POSIX ითვალისწინებს სინქრონიზებული I / O- ს სამ განსხვავებულ ვარიანტებს, რომლებიც შეესაბამება OZYCC , O_DSYNC და O_RSYNC- ს დროშებს . ამჟამად (2.1.130) ეს ყველაფერი სინონიმია Linux- ის მიხედვით.