Ვისწავლოთ Linux Command Open

სინოფსისი

# მოიცავს << 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- ის მიხედვით.