تعلم قيادة لينكس المفتوحة

ملخص

#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 علام int open (const char * pathname ، int flag، mode mode mode الباحثون int (const char * pathname ، وضع mode_t ) ؛

وصف

يتم استخدام الأمر open () استدعاء النظام linux لتحويل اسم مسار إلى واصف ملف (عدد صحيح صغير غير سلبي للاستخدام في I / O اللاحقة كما في القراءة والكتابة وما إلى ذلك). عند نجاح المكالمة ، يكون واصف الملف الذي تم إرجاعه wil هو واصف الملف الأدنى غير مفتوح حاليًا للعملية. تنشئ هذه المكالمة ملفًا مفتوحًا جديدًا ، ولا تتم مشاركته مع أي عملية أخرى. (ولكن قد تنشأ ملفات مفتوحة مشتركة عبر استدعاء النظام fork (2).) تم تعيين واصف الملف الجديد ليظل مفتوحًا عبر وظائف exec (انظر fcntl (2)). يتم تعيين إزاحة الملف إلى بداية الملف.

علامات المعلمة هي واحدة من O_RDONLY ، O_WRONLY أو O_RDWR التي تطلب فتح الملف للقراءة فقط أو الكتابة فقط أو القراءة / الكتابة ، على التوالي ، bitwise- أو 'd مع صفر أو أكثر من الإجراءات التالية:

O_CREAT

إذا كان الملف غير موجود ، فسيتم إنشاؤه. يتم تعيين المالك (معرف المستخدم) للملف إلى معرف المستخدم الفعال للعملية. يتم تعيين ملكية المجموعة (معرف المجموعة) إما إلى معرف المجموعة الفعال للعملية أو إلى معرف المجموعة للدليل الرئيسي (حسب نوع نظام الملفات وخيارات التحميل ، ووضع الدليل الرئيسي ، انظر ، على سبيل المثال ، التثبيت خيارات bsdgroups و sysvgroups لنظام الملفات ext2 ، كما هو موضح في جبل (8)).

O_EXCL

عند استخدامها مع O_CREAT ، إذا كان الملف موجودًا بالفعل فهذا خطأ وسيفشل فتح . في هذا السياق ، يوجد رابط رمزي ، بغض النظر عن المكان الذي يشير إليه. O_EXCL مكسورة على أنظمة الملفات NFS ، البرامج التي تعتمد عليها لأداء مهام التأمين سوف تحتوي على حالة سباق. الحل لأداء تأمين الملف الذري باستخدام lockfile هو إنشاء ملف فريد على نفس fs (على سبيل المثال ، دمج اسم المضيف و pid) ، استخدم الارتباط (2) لإنشاء ارتباط إلى lockfile. إذا أرجعت link () 0 ، يكون القفل ناجحًا. وإلا ، استخدم stat (2) على الملف الفريد للتحقق مما إذا كان عدد الارتباطات الخاص به قد ارتفع إلى 2 ، وفي هذه الحالة يكون القفل ناجحًا أيضًا.

O_NOCTTY

إذا كان اسم المسار يشير إلى جهاز طرفي --- انظر tty (4) --- فإنه لن يصبح طرفًا متحكمًا في العملية حتى إذا لم تكن العملية واحدة.

O_TRUNC

إذا كان الملف موجودًا بالفعل وكان ملفًا عاديًا ويسمح وضع الفتح بالكتابة (على سبيل المثال ، O_RDWR أو O_WRONLY) ، فسيتم اقتطاعه إلى طول 0. إذا كان الملف ملف FIFO أو الجهاز الطرفي ، فسيتم تجاهل علامة O_TRUNC. خلاف ذلك ، فإن تأثير O_TRUNC غير محدد. (في العديد من إصدارات Linux ، سيتم تجاهلها ؛ في الإصدارات الأخرى ، ستعرض خطأ).

O_APPEND

يتم فتح الملف في وضع الإلحاق. قبل كل كتابة ، يتم وضع مؤشر الملف في نهاية الملف ، كما لو كان مع lseek . قد يؤدي O_APPEND إلى ملفات تالفة على أنظمة الملفات NFS إذا ألقت عملية أكثر من واحد البيانات إلى ملف في وقت واحد. ويرجع ذلك إلى أن NFS لا يدعم إلحاق ملف ، لذا يجب على kernel العميل محاكاته ، والتي لا يمكن إجراؤها بدون حالة سباق.

O_NONBLOCK أو O_NDELAY

عندما يكون ذلك ممكنًا ، يتم فتح الملف في وضع عدم الحظر. لن يؤدي فتح أو أي عمليات لاحقة على واصف الملف التي يتم إرجاعها إلى انتظار عملية الاستدعاء. للتعامل مع FIFOs (أنابيب مسمّى) ، انظر أيضا fifo (4). لا يجب أن يكون لهذا الوضع أي تأثير على الملفات الأخرى بخلاف FIFOs.

O_SYNC

يتم فتح الملف للإدخال / الإخراج المتزامن. أي الكتابة على واصف الملف الناتج سيتم حظر عملية الاستدعاء حتى يتم كتابة البيانات جسديا إلى الأجهزة الأساسية. انظر القيود أدناه ، على الرغم من.

O_NOFOLLOW

إذا كان اسم المسار هو ارتباط رمزي ، عندها يفشل فتح. هذا هو امتداد FreeBSD ، الذي تمت إضافته إلى Linux في الإصدار 2.1.126. لا يزال سيتم اتباع الروابط الرمزية في المكونات السابقة من اسم المسار. تتضمن الرؤوس من glibc 2.0.100 والإصدارات الأحدث تعريفًا لهذه العلامة؛ سوف اللب قبل 2.1.126 تجاهلها إذا استخدمت .

O_DIRECTORY

إذا كان اسم المسار ليس دليلاً ، فسيتسبب في فشل الفتح. هذه العلامة خاصة بـ Linux ، وتمت إضافتها في إصدار kernel 2.1.126 ، لتجنب مشكلات رفض الخدمة في حالة استدعاء opendir (3) على جهاز FIFO أو شريط ، ولكن لا يجب استخدامه خارج تطبيق opendir .

O_DIRECT

حاول تقليل تأثيرات ذاكرة التخزين المؤقت للإدخال / الإخراج من وإلى هذا الملف. بشكل عام سيؤدي ذلك إلى انخفاض الأداء ، ولكنه مفيد في حالات خاصة ، مثل عندما تقوم التطبيقات بالتخزين المؤقت الخاص بها. تتم عملية إدخال / إخراج الملف مباشرة من / إلى مخازن مساحة المستخدم. I / O متزامن ، أي عند الانتهاء من قراءة نظام (2) أو كتابة (2) ، يتم ضمان نقل البيانات. يجب أن تكون أحجام النقل ، ومحاذاة المخزن المؤقت للمستخدم وإزاحة الملف جميعها مضاعفات حجم الكتلة المنطقية لنظام الملفات.
هذه العلامة مدعومة على عدد من الأنظمة المشابهة لنظام يونكس. تمت إضافة الدعم تحت Linux في إصدار kernel 2.4.10.
تم وصف واجهة مشابهة لغويًا لأجهزة الحظر في الخام (8).

O_ASYNC

قم بإنشاء إشارة (SIGIO بشكل افتراضي ، ولكن يمكن تغيير ذلك عبر fcntl (2)) عندما يصبح الإدخال أو الإخراج ممكنًا على واصف الملف هذا. هذه الميزة متاحة فقط للمحطات الطرفية ، والمحطات الزائفة ، والمقابس. انظر fcntl (2) لمزيد من التفاصيل.

O_LARGEFILE

في الأنظمة 32 بت التي تدعم نظام الملفات الكبيرة ، تسمح للملفات التي لا يمكن تمثيل أحجامها في 31 بتة ليتم فتحها.

يمكن تغيير بعض هذه العلامات الاختيارية باستخدام fcntl بعد فتح الملف.

يحدد وضع الوسيطة الأذونات الواجب استخدامها في حالة إنشاء ملف جديد. يتم تعديلها بواسطة umask العملية بالطريقة المعتادة: أذونات الملف الذي تم إنشاؤه (وضع & umask) . لاحظ أن هذا الوضع ينطبق فقط على عمليات الوصول المستقبلية للملف المنشأ حديثًا ؛ قد تقوم المكالمة المفتوحة التي تقوم بإنشاء ملف للقراءة فقط بإرجاع واصف ملف للقراءة / الكتابة.

يتم توفير الثوابت الرمزية التالية للوضع :

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 في العلامات ، ويتم تجاهله بطريقة أخرى.

يخلق ما يعادل فتح بأعلام مساوية O_CREAT | O_WRONLY | O_TRUNC .

قيمة الإرجاع

فتح وإعادة إنشاء واصف الملف الجديد ، أو -1 إذا حدث خطأ (في هذه الحالة ، يتم تعيين errno بشكل مناسب). لاحظ أن الفتح يمكن أن يفتح ملفات خاصة بالجهاز ، لكن لا يستطيع Creaters إنشائها - استخدم mknod (2) بدلاً من ذلك.

على أنظمة الملفات NFS مع تمكين تعيين UID ، قد يقوم open بإرجاع واصف ملف ولكن على سبيل المثال ، يتم رفض قراءة (2) طلبات باستخدام EACCES . ويرجع ذلك إلى قيام العميل بإجراء عملية فتح عن طريق التحقق من الأذونات ، ولكن يتم تنفيذ تعيين UID من قبل الملقم عند قراءة وكتابة الطلبات.

إذا تم إنشاء الملف حديثًا ، فسيتم تعيين الحقول mtime و ctime و mtime على الوقت الحالي ، وكذلك حقول ctime و mtime للدليل الأساسي. وإلا ، إذا تم تعديل الملف بسبب علامة O_TRUNC ، يتم تعيين الحقول ctime و mtime الخاصة به إلى الوقت الحالي.

أخطاء

EEXIST

اسم المسار موجود بالفعل وتم استخدام O_CREAT و O_EXCL .

EISDIR

يشير pathname إلى دليل والوصول المطلوب الكتابة المعنية (أي ، يتم تعيين O_WRONLY أو O_RDWR ).

EACCES

لا يُسمح بالوصول المطلوب إلى الملف ، أو لم تسمح إحدى الدلائل في اسم المسار بإذن بحث (تنفيذ) ، أو لم يكن الملف موجودًا حتى الآن ولا يُسمح بكتابة الوصول إلى الدليل الأصل.

ENAMETOOLONG

اسم المسار طويل جدا.

ENOENT

لم يتم تعيين O_CREAT ولا يوجد الملف المحدد. أو ، لا يوجد مكون دليل في مسار أو هو ارتباط رمزي متدلي.

ENOTDIR

لا يعتبر المكون المستخدم كدليل في مسار ، في الواقع ، دليلاً ، أو تم تحديد O_DIRECTORY وكان اسم المسار غير دليل.

ENXIO

O_NONBLOCK | تم تعيين O_WRONLY ، الملف المسمى هو FIFO ولم يتم فتح الملف للقراءة. أو ، الملف هو ملف خاص بجهاز ولا يوجد جهاز مناظر.

ENODEV

يشير pathname إلى ملف خاص بالجهاز ولا يوجد جهاز مناظر. (هذا خطأ في kernel Linux - في هذه الحالة يجب إرجاع ENXIO.)

EROFS

يشير pathname إلى ملف على نظام ملفات للقراءة فقط ، وقد تم طلب الوصول للكتابة.

ETXTBSY

يشير pathname إلى صورة قابلة للتنفيذ يتم تنفيذها حاليًا ويتم طلب الوصول للكتابة.

EFAULT

نقاط اسم المسار خارج مساحة العنوان التي يمكن الوصول إليها.

ELOOP

تمت مصادفة العديد من الارتباطات الرمزية في حل مسار ، أو تم تحديد O_NOFOLLOW ولكن كان اسم المسار ارتباطًا رمزيًا.

ENOSPC

اسم الملف المراد إنشاؤه ولكن لا يحتوي الجهاز الذي يحتوي على اسم المسار على أي مساحة للملف الجديد.

ENOMEM

كانت ذاكرة kernel غير كافية.

EMFILE

تحتوي العملية بالفعل على الحد الأقصى لعدد الملفات المفتوحة.

ENFILE

تم الوصول إلى الحد الأقصى لعدد الملفات المفتوحة على النظام.

التاكيد الى

SVr4 ، SVID ، POSIX ، X / OPEN ، BSD 4.3 إن علامتي O_NOFOLLOW و O_DIRECTORY هما Linux -specific. قد يتعين على المرء تحديد الماكرو _GNU_SOURCE للحصول على التعريفات الخاصة به.

قيود

هناك العديد من infelicities في البروتوكول الأساسي NFS ، التي تؤثر بين O_SYNC و O_NDELAY .

يوفر POSIX لثلاثة أنواع مختلفة من I / O متزامنة ، المقابلة للأعلام O_SYNC ، O_DSYNC و O_RSYNC . حاليا (2.1.130) كلها مترادفة في لينكس.