هل هناك تسرب واصف ملف عند استخدام مآخذ على منصة Linux؟

StackOverflow https://stackoverflow.com/questions/429762

سؤال

إذا فتحت وأغلق مقبسًا عن طريق الاتصال على سبيل المثال

Socket s = new Socket( ... );
s.setReuseAddress(true);
in = s.getInputStream();
...
in.close(); 
s.close();      

ينص Linux على أن هذا المقبس لا يزال مفتوحًا أو على الأقل واصف الملف للاتصال. عند الاستعلام عن الملفات المفتوحة لهذه العملية بواسطة LSOF ، يوجد إدخال للاتصال المغلق:

COMMAND  PID   USER   FD   TYPE DEVICE     SIZE   NODE NAME
java    9268 user    5u  sock    0,4           93417 can't identify protocol

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

هل كانت مفيدة؟

المحلول

إذا كانت هذه المقابس كلها في حالة time_wait ، فهذا أمر طبيعي ، على الأقل لفترة قصيرة. تحقق من ذلك مع NetStat ؛ من الشائع أن يتم التسكع لبضع دقائق لضمان إلقاء البيانات المذهلة من المقبس بنجاح قبل إعادة استخدام المنفذ لمقبس جديد.

نصائح أخرى

قد ترغب أيضًا في التحقق /proc/<pid>/fd, ، سيحتوي الدليل على جميع واصفات الملفات التي تم فتحها حاليًا. إذا اختفى ملف بعد إغلاق المقبس ، فلن تواجه أي مشاكل (على الأقل ليس مع واصفات الملفات :).

أعتقد أنها ليست مشكلة برنامجك.

في Sun_Java ، عند تحميل Lib الأصلي المرتبط بالمقبس ، سيتم إنشاء Magic_sock FD.

اكتب على magic_sock ستؤدي إلى استثناء راحة الاتصال ، وقراءة على magic_sock ستؤدي إلى EOF.

تم إغلاق نظير Magic_sock بالكامل ، و Magic_Sock نفسه نصف _closed ، وستظل الحالة "لا يمكن تحديد البروتوكول".

ربما يكون مقبسًا لبعض البروتوكول الآخر ("لا يمكن تحديد البروتوكول" EH؟) يستخدم داخليًا في التنفيذ لفعل شيء ما ، والذي يتم إنشاؤه على المقبس الأول.

هل حاولت إنشاء مآخذ مآخذ وإغلاقها بشكل متكرر ، لمعرفة ما إذا كانت هذه المقابس مستمرة حقًا؟ يبدو من المحتمل أن هذا لمرة واحدة.

ربما تستخدم Java مآخذ ملوك داخليًا للعديد من الأشياء - قد تكون Unix أو NetLink (تحت Linux) أو نوع آخر من المقبس.

قم بإنشاء برنامج نصي صغير Bash لمراقبة مآخذ فتحات مفتوحة لتطبيق أو PID معين ، واتركه يعمل أثناء اختبار تطبيق Java الخاص بك.

أشك على أي حال في أن هناك أي نوع من التسريبات في هذا الشيء حيث يتم استخدام مآخذ جدا في Linux/Unix World وهذا النوع من المشاكل سوف يفتقر سريعًا جدًا

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