سؤال

لقد تتبعت عملية أوراكل ، وأجدها أولاً افتح ملفًا /etc/netconfig كملف مقبض 11, ثم تكرارها 256 بالاتصال fcntl مع المعلمة F_DUPFD, ، وثم close مقبض الملف الأصلي 11. في وقت لاحق قرأت باستخدام مقبض الملفات 256. إذن ما الفائدة من تكرار مقبض الملف؟ لماذا لا تعمل فقط على مقبض الملف الأصلي؟

12931:   0.0006 open("/etc/netconfig", O_RDONLY|O_LARGEFILE)    = 11
12931:   0.0002 fcntl(11, F_DUPFD, 0x00000100)                  = 256
12931:   0.0001 close(11)                                       = 0
12931:   0.0002 read(256, " # p r a g m a   i d e n".., 1024)   = 1024
12931:   0.0003 read(256, " t s           t p i _ c".., 1024)   = 215
12931:   0.0002 read(256, 0x106957054, 1024)                    = 0
12931:   0.0001 lseek(256, 0, SEEK_SET)                         = 0
12931:   0.0002 read(256, " # p r a g m a   i d e n".., 1024)   = 1024
12931:   0.0003 read(256, " t s           t p i _ c".., 1024)   = 215
12931:   0.0003 read(256, 0x106957054, 1024)                    = 0
12931:   0.0001 close(256)                                      = 0
هل كانت مفيدة؟

المحلول

جانبا ، هم ملف الواصفات بدلا من الملف مقابض. هذا الأخير ميزة C المستخدمة مع fopen وإخوانها بينما الواصفات أكثر unixy ، للاستخدام مع open وآخرون.

مثير للاهتمام. السبب الوحيد الذي يتبادر إلى الذهن هو أن بعض الكود الآخر لديه حاجة محددة إلى أن يكون واصف الملف 256. أظن أن أوراكل فقط ستعرف الأسباب الغريبة لذلك. في أي حال ، لست مضمونًا للحصول على 256 ، يمكنك الحصول على أول واصف الملف المتاح أكبر من أو يساوي هذا الرقم.


من القليل من التحقيق (لا أعرف كل الشيء القليل عن الأجزاء الداخلية لـ Unix من أعلى رأسي) ، هناك سمات تنتمي إلى مجموعة من الواصفات المكررة مثل موضع الملف ووضع الوصول. هناك سمات أخرى تنتمي إلى غير متزوج واصف الملف ، حتى عند التكرار ، مثل علامة الإغلاق الإقليمية في Gnulib.

القيام بتكرار (إما مع dup, dup2 أو الخاص بك fcntl) يمكن أن تكون وسيلة لإنشاء واصفتين ، واحدة ذات سمات واصف ملفات مختلفة ، لكن لا يمكنني رؤية أن الأمر في سؤالك نظرًا لأن الواصف الأول مغلق على أي حال. كما تقول ، لماذا لا تستخدم الواصف المنخفض فقط؟

ومن المثير للاهتمام ، إذا كنت جوجل ل netconfig f_dupfd, ، سترى آثار مماثلة حيث fcntl يفشل ويستمر في قراءة هذا الملف مع الواصف المنخفض ، لذا فإن أفكاري حول هذا الموضوع هي أن هذه محاولة للحفاظ على واصفات الملفات المنخفضة قدر الإمكان. علي سبيل المثال:

4327:   open("/etc/netconfig", O_RDONLY|O_LARGEFILE)    = 4
4327:   fcntl(4, F_DUPFD, 0x00000100)                   Err#22 EINVAL
4327:   read(4, " # p r a g m a   i d e n".., 1024)     = 1024
4327:   read(4, " t s           t p i _ c".., 1024)     = 215
4327:   read(4, 0x00296B80, 1024)                       = 0
4327:   lseek(4, 0, SEEK_SET)                           = 0
4327:   read(4, " # p r a g m a   i d e n".., 1024)     = 1024
4327:   read(4, " t s           t p i _ c".., 1024)     = 215
4327:   read(4, 0x00296B80, 1024)                       = 0
4327:   close(4)                                        = 0

ربما يحتوي البرنامج على مجموعة بايت من واصفات الملفات في مكان ما محدودة ، لذا يحاول نقل الملفات الأخرى فوق الحد الأقصى 255.

لكن في الحقيقة ، هذا مجرد تخمين من جانبي (على الرغم من أنني أود أن أعتقد أنه تخمين ذكي نسبيًا). ضع في اعتبارك أيضًا أنه قد لا يكون أوراكل نفسه يفعل ذلك. يتم استخدام أشياء NetConfig في الكثير من الأماكن ، لذا فقد تكون مكتبة أساسية تقوم بذلك ، خاصة في ضوء حقيقة أن معظم أغاني الويب المذكورة أعلاه لم تكن خاصة بـ Oracle (ftp, remsh وهلم جرا).

نصائح أخرى

في بعض الأنظمة ، مثل Solaris ، يعمل I/O القياسي مع الملف فقط مع واصفات الملفات 0-255 لأن تنفيذها لهيكل الملف يستخدم عددًا صحيحًا 8 بت بدلاً من int. إذا كان البرنامج يستخدم الكثير من واصفات الملفات ، فمن المفيد حجز واصفات الملفات 3-255 باستخدام FNCTL (FD ، F_DUPFD ، 256). خلاف ذلك ، ستفشل وظائف مثل FOPEN () و FREOPEN () و FDOPEN () إذا كان لديك 256 ملفًا مفتوحًا.

فيما يلي مثال آخر عند الحاجة إلى تقنية لحفظ واصفات الملفات منخفضة الأرقام.

افترض أن العملية تفتح عددًا كبيرًا من واصف الملف على سبيل المثال ، فهي تقبل أكثر من 1024 اتصالات مأخذ توصيل متزامنة. في الوقت نفسه ، تستخدم العملية أيضًا مكتبة طرف ثالث تفتح اتصالات المقبس ويستخدمها select() لمعرفة ما إذا كانت المقابس جاهزة للقراءة أو الكتابة. بالإضافة إلى ذلك ، تم تجميع مكتبة الطرف الثالث مع __FD_SETSIZE ضبط على 1024 (القيمة الافتراضية).

إذا فتحت المكتبة مقبسًا عندما تكون جميع واصفات الملفات أدناه 1024 قيد الاستخدام ، فسيحصل على واصف ذلك select() ومرتبطة FD_* الماكرو لا يمكن أن تتعامل مع. سيؤدي ذلك إلى تعطل العملية أو غير محددة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top