كيفية التأكد من أنه عندما تعمل عمليتي على ملف ، لا تحاول أي عملية أخرى الكتابة إليها أو حذفها؟
-
28-09-2019 - |
سؤال
إذا كانت عمليتي تحاول القراءة من ملف ، فكيف يمكنني التأكد من ذلك من الكود (لغة C) أنه لا توجد عملية أخرى تكتب إليها أو تحذفها (قم بتضمين أوامر النظام لحذف الملف)؟
أيضًا ، هل يمكن تحقيق ذلك على جميع نظام التشغيل (Windows ، Linux ، Solaris ، HP-UX ، VXWorks إلخ)؟
المحلول
تحرير: سأجيب على UNIX/Linux
كما قال GSPR وآخرون ، ألق نظرة على قفل الملف باستخدام fcntl
, flock
, ، إلخ. ومع ذلك ، حذر من أن هذه هي قفل استشاري طُرق.
ماذا يعني هذا؟ هذا يعني أنه يمكنك تحذير العمليات الأخرى التي تقوم بها حاليًا بملف أو جزء منه ، ولكن لا يمكنك منعهم بالقوة من تجاهلك والكتابة في جميع أنحاء ملفك.
لا توجد بدايات قفل إلزامية. يمكنك استخدام الأذونات لصالحك ، ولكن لن يكون لديك أي ضمانات كاملة - يمكن للمستخدم الجذر دائمًا تجاوز حدودك. لا أعتقد أن هناك طريقة للتغلب على ذلك.
نصائح أخرى
لأنظمة Posix ، ألق نظرة على fcntl
. flock
يمكن أن تكون موضع اهتمام أيضًا ، على الرغم من أنني لا أعتقد أنها جزء من Posix.
يجب عليك فتح الملف مع قراءة أذونات المشاركة ، مما يعني أن أي شخص آخر يحاول فتحه يمكنه فقط الحصول على وصول القراءة. كما يقول pointy ، هذا هو نظام التشغيل الخاص وربما يتعين عليك ترميز هذا بشكل منفصل لنظام التشغيل Windows ، Linux ، إلخ. ومع ذلك ، فإن معظم OSS حديثة ينبغي دعم هذا.
انسخ الملف ، وقم بإجراء تغييراتك ، ثم أعد تسميته مرة أخرى على الأصل.
هناك طريقة أخرى ، إذا لم يكن الملف بعد ، هي إنشاء الملف باستخدام أعلام حصرية ، ثم حذفه من نظام الملفات. قم بتنفيذ كتابتك ، ثم قم بربطها بقوة مرة أخرى إلى نظام الملفات (موجود حاليًا فقط كإيقاع مفتوح). يمكنك الاستفادة من /proc
لمسار المصدر.