سؤال

Win32 هو CreateFile وقد FILE_FLAG_DELETE_ON_CLOSE, ولكن أنا على لينكس.

أريد أن أفتح ملف مؤقت والتي سوف تكون دائما المحذوفة عند إنهاء البرنامج.أنا يمكن أن نفهم أنه في حالة تحطم البرنامج قد لا يكون من العملي لضمان هذا ولكن في أي حالة أخرى أود أن تعمل.

أنا أعرف عن RAII.أنا أعرف عن الإشارات.أنا أعرف عن atexit(3).وأنا أعلم أنني يمكن فتح الملف ثم حذفه فورا و الملف سيبقى موجودا حتى واصف الملف مغلق (حتى مقابض حادث).أيا من هذه تبدو وكأنها كاملة ومباشرة الحل:

  1. RAII:حدث لي هذا:أنا كائن الذين المدمر حذف الملف ولكن المدمر لا يسمى إذا تم إنهاء البرنامج قبل إشارة.
  2. إشارات:أنا أكتب على مستوى منخفض المكتبة مما يجعل تسجيل إشارة معالج أمرا صعب.على سبيل المثال ، ما إذا كان التطبيق يستخدم إشارات نفسها ؟ أنا لا أريد أن أتدخل.كنت قد تنظر في استخدام ذكي من بعض sigaction(2) للتعامل...ولكن لم تضع ما يكفي من التفكير في هذا الاحتمال حتى الآن.
  3. atexit(3):على ما يبدو عديم الفائدة لأنه لا يسمى خلال إنهاء غير طبيعي (مثلا ، عبر إشارة).
  4. استباقية unlink(2):هذا هو جيد جدا إلا أنني في حاجة إلى ملف تبقى مرئية في نظام الملفات (وإلا فإن النظام هو من الصعب رصد/استكشاف الأخطاء وإصلاحها).

ماذا كنت تفعل هنا ؟

مزيد من التوضيح

أنا حذفه واحد من التفصيل في منصبي الأصلي الذي أدرك الآن أنني يجب أن تدرج."ملف" في هذه الحالة هو ليس مجرد ملف عادي, بل هو POSIX انتظار الرسائل.لقد خلق ذلك عن طريق mq_open().أنها يمكن أن تكون مغلقة عن طريق mq_close() أو close() (السابق مستعار الأخير على نظام بلدي).ويمكن إزالتها من النظام عن طريق mq_unlink().كل هذا يجعل مماثلة ملف العادية ، إلا لا أستطيع اختيار الدليل الذي يتواجد الملف.هذا يجعل الحالية الجواب الأكثر شعبية (وضع الملف في /tmp) غير قابلة للتطبيق ، لأن "ملف" تم إنشاؤه من قبل النظام في نظام ملفات ظاهري مع قدرة محدودة جدا.(لقد شنت ملفات ظاهري في /dev/mqueue, عقب سبيل المثال في man mq_overview) .

وهذا ما يفسر أيضا لماذا أنا في حاجة إلى اسم أن تظل مرئية (صنع فورية-ربط النهج غير قابلة للتطبيق):"ملف" يجب أن تكون مشتركة بين اثنين أو أكثر من العمليات.

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

المحلول

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

إن لم يكن, ثم ربما ليس هناك حل مثالي.وأود أن تنظر الجمع إشارة التعامل مع استراتيجية مع ما كميل Kisiel يوحي.هل يمكن أن تتبع إشارة معالجات تثبيت قبل تثبيت معالجات الإشارات.إذا كان معالج الافتراضي هو SIG_IGN لن عادة تثبيت الخاصة بك معالج;إذا كان SIG_DFL ، هل تذكر ذلك ؛ إذا كان شيء آخر - المستخدم-تعريف إشارة معالج - يجب أن نتذكر أن المؤشر ، وتثبيت الخاصة بك.عندما معالج كان يسمى أنك تفعل ما عليك القيام به ، ومن ثم استدعاء تذكرت معالج, وهكذا تسلسل معالجات.يمكنك أيضا تثبيت atexit() معالج.يمكنك أيضا الوثيقة أن تفعل هذا, و الإشارات التي كنت تفعل ذلك.

علما بأن إشارة التعامل مع غير كاملة الاستراتيجية ؛ SIGKILL لا يمكن القبض ، atexit() معالج لن يتم استدعاء الملف سوف تترك حولها.

ديفيد Segond اقتراح - ملف مؤقت اسم الشيطان هي مثيرة للاهتمام.على العمليات البسيطة ، فمن كافية ؛ إن عملية طلب ملف مؤقت الشوك و يتوقع الطفل أن تملك ملف بعد ذلك (و المخارج) ثم الشيطان لديه مشكلة كشف عند آخر عملية استخدامه يموت - لأنها لا تعرف تلقائيا العمليات التي فتحها.

نصائح أخرى

إذا كنت مجرد جعل ملف مؤقت فقط إنشاء في /tmp أو فرعي منه.ثم تبذل أقصى جهد لإزالة عندما يتم ذلك من خلال atexit(3) أو ما شابه ذلك.طالما كنت تستخدم أسماء فريدة التقطت خلال mkstemp(3) أو ما شابه حتى إذا لم يتم حذفها بسبب تحطم البرنامج, لا خطر قراءته مرة أخرى على تشغيل اللاحقة أو غيرها من مثل هذه الظروف.

في تلك المرحلة هو فقط على مستوى النظام مشكلة حفظ /tmp نظيفة.معظم توزيعات يمسح على الحذاء أو إيقاف تشغيل أو تشغيل العادية cronjob حذف الملفات القديمة.

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

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

في الماضي, يجب بناء مؤقت "مدير الملفات" التي تحفظ مسار الملفات المؤقتة.

واحد طلب ملف مؤقت اسم من المدير و كان هذا الاسم المسجل.

مرة واحدة لا تحتاج ملف مؤقت اسم أي أكثر من ذلك ، يمكنك إبلاغ مدير الملف غير مسجلة.

عند تلقي إشارة إنهاء جميع المسجلين الملفات المؤقتة دمرت.

مؤقتة أسماء كانت UUID القائمة على تجنب الاصطدامات.

هل يمكن أن يكون عملية مفترق بعد إنشاء الملف ثم انتظر على الطفل أن إغلاق ثم الأصل أن ربط الملف والخروج.

لقد انضم ستاكوفيرفلوو وجدت لك هنا :)

إذا كنت المشكلة لإدارة mq الملفات والحفاظ عليها من تتراكم ، كنت لا حقا بحاجة إلى ضمان حذف الملف عند الإنهاء.وإذا أردت فقط أن الملفات عديمة الفائدة من تتراكم من الحفاظ على دورية قد يكون كل ما تحتاجه.إضافة إدخال إلى مجلة الملف بعد mq فتح إدخال آخر عندما يكون مغلق عندما المكتبة الخاصة بك يتم تهيئة تحقق التناقض في مجلة واتخاذ كل الإجراءات اللازمة لتصحيح التناقض.إذا كنت تقلق بشأن تحطمها عند mq_open/mq_close يسمى ، يمكنك أيضا إضافة إدخال دفتر اليومية قبل تلك الوظائف تسمى.

  • يكون حفظ كتاب دليل الملفات المؤقتة تحت نقطة الدليل.
  • عند إنشاء temp ملف إنشاء أول كتاب حفظ الملف في حفظ كتاب الدليل الذي يحتوي على المسار أو UUID الخاص بك إلى ملف مؤقت.
  • خلق هذا ملف temp.
  • عندما temp-حذف الملف ، ثم حذف الكتاب حفظ الملف.
  • عند بدء تشغيل البرنامج ، مسح حفظ كتاب دليل أي ملفات تحتوي على مسارات الملفات المؤقتة ومحاولة وحذفها إذا وجدت لهم حذف الكتاب حفظ الملفات.
  • (تسجيل الدخول بصخب إن أي خطوة فشل.)

أنا لا أرى طرق القيام بذلك بأي طريقة أكثر بساطة.هذا هو المتداول أي إنتاج جودة البرنامج يجب أن تذهب من خلال ، +500 خطوط بسهولة.

هل حقا تحتاج إلى اسم أن تظل مرئية ؟

افترض أنك تأخذ الخيار على الفور إلغاء ربط الملف.ثم:

  • استباقية ربط(2):هذا هو جيد جدا إلا أنني في حاجة إلى ملف تبقى مرئية في نظام الملفات (وإلا فإن النظام هو من الصعب رصد/استكشاف الأخطاء وإصلاحها).

    يمكنك لا يزال التصحيح على حذف الملف لأنه سوف لا يزال تكون مرئية تحت /proc/$pid/fd/.طالما كنت تعرف pids من عمليات تعداد بهم فتح الملفات ينبغي أن يكون من السهل.

  • أسماء ضرورة أن تظل مرئية أثناء التشغيل العادي لأنها مشتركة بين البرامج.

    لا يزال يمكنك مشاركة حذف الملف المفتوح بين العمليات التي تمر حول ملف واصف على Unix المجال مآخذ.انظر المحمولة طريقة تمرير ملف واصف بين العمليات المختلفة للحصول على مزيد من المعلومات.

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