OnWorks Linux و Windows Online WorkStations

الشعار

استضافة مجانية على الإنترنت لمحطات العمل

<السابق | المحتويات | التالي>

الفخاخ

في الفصل العاشر ، رأينا كيف يمكن للبرامج أن تستجيب للإشارات. يمكننا إضافة هذه الإمكانية إلى نصوصنا أيضًا. في حين أن البرامج النصية التي كتبناها حتى الآن لم تكن بحاجة إلى هذه الإمكانية (لأنها تتميز بأوقات تنفيذ قصيرة جدًا ولا تنشئ ملفات مؤقتة) ، فقد تستفيد البرامج النصية الأكبر والأكثر تعقيدًا من وجود روتين للتعامل مع الإشارات.

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

سحق يوفر آلية لهذا الغرض تعرف باسم فخ. يتم تنفيذ المصائد باستخدام الأمر المدمج المسمى بشكل مناسب ، فخ. فخ يستخدم الصيغة التالية:

فخ إشارة الحجة [بسيطة...]

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

اليك مثال بسيط:



#! / بن / باش


# trap-demo: عرض بسيط للتعامل مع الإشارات

#! / بن / باش


# trap-demo: عرض بسيط للتعامل مع الإشارات


trap "صدى" أنا أتجاهلك. "SIGINT SIGTERM لأني في {1..5} ؛ فعل

صدى "التكرار $ i من 5" النوم 5

فعل

trap "صدى" أنا أتجاهلك. "SIGINT SIGTERM لأني في {1..5} ؛ فعل

صدى "التكرار $ i من 5" النوم 5

فعل


يعرّف هذا البرنامج النصي المصيدة التي ستنفذ ملف صدى أمر في كل مرة يتم فيها استقبال إشارة SIG-INT أو SIGTERM أثناء تشغيل البرنامج النصي. يبدو تنفيذ البرنامج على هذا النحو عندما يحاول المستخدم إيقاف البرنامج النصي بالضغط السيطرة- ج:


[me @ linuxbox ~] $ فخ تجريبي

التكرار 1 من 5

التكرار 2 من 5 أنا أتجاهلك. التكرار 3 من 5 أنا أتجاهلك. التكرار 4 من 5

التكرار 5 من 5

[me @ linuxbox ~] $ فخ تجريبي

التكرار 1 من 5

التكرار 2 من 5 أنا أتجاهلك. التكرار 3 من 5 أنا أتجاهلك. التكرار 4 من 5

التكرار 5 من 5


كما نرى ، في كل مرة يحاول المستخدم مقاطعة البرنامج ، تتم طباعة الرسالة بدلاً من ذلك.

قد يكون إنشاء سلسلة لتكوين تسلسل مفيد من الأوامر أمرًا محرجًا ، لذلك من الشائع تحديد وظيفة shell كأمر. في هذا المثال ، تم تحديد دالة shell منفصلة لكل إشارة يتم التعامل معها:



#! / بن / باش

# trap-demo2: معالجة الإشارات البسيطة التجريبية exit_on_signal_SIGINT () {

صدى "سكريبت توقف." 2> & 1 مخرج 0

}


exit_on_signal_SIGTERM () {

صدى "تم إنهاء البرنامج النصي". 2> & 1 مخرج 0

}


المصيدة exit_on_signal_SIGINT SIGINT الملاءمة exit_on_signal_SIGTERM SIGTERM

#! / بن / باش

# trap-demo2: معالجة الإشارات البسيطة التجريبية exit_on_signal_SIGINT () {

صدى "سكريبت توقف." 2> & 1 مخرج 0

}


exit_on_signal_SIGTERM () {

صدى "تم إنهاء البرنامج النصي". 2> & 1 مخرج 0

}


المصيدة exit_on_signal_SIGINT SIGINT الملاءمة exit_on_signal_SIGTERM SIGTERM



بالنسبة إلى i في {1..5} ؛ فعل

صدى "التكرار $ i من 5" النوم 5

فعل


بالنسبة إلى i في {1..5} ؛ فعل

صدى "التكرار $ i من 5" النوم 5

فعل


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

عندما يضغط المستخدم السيطرة- ج أثناء تنفيذ هذا البرنامج النصي ، تبدو النتائج كما يلي:



[me @ linuxbox ~] $ فخ تجريبي 2

التكرار 1 من 5

التكرار 2 من 5 تمت مقاطعة البرنامج النصي.

[me @ linuxbox ~] $ فخ تجريبي 2

التكرار 1 من 5

التكرار 2 من 5 تمت مقاطعة البرنامج النصي.


صورة

ملفات مؤقتة

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

tempfile = / tmp / $ (basename $ 0). $$. $ RANDOM

سيؤدي هذا إلى إنشاء اسم ملف يتكون من اسم البرنامج ، متبوعًا بمعرف العملية (PID) ، متبوعًا بعدد صحيح عشوائي. لاحظ ، مع ذلك ، أن ملف $ RAN- DOM يُرجع متغير shell فقط قيمة في النطاق 1-32767 ، وهي ليست نطاقًا كبيرًا جدًا من حيث الكمبيوتر ، لذا فإن مثيلًا واحدًا من المتغير لا يكفي للتغلب على مهاجم محدد.



صورة

أفضل طريقة لاستخدام com.mktemp البرنامج (يجب عدم الخلط بينه وبين برنامج com.mktemp مكتبة قياسية) لكل من الاسم وإنشاء الملف المؤقت. ال عضو الكنيست- درجة الحرارة يقبل البرنامج قالبًا كوسيطة تُستخدم لبناء اسم الملف. يجب أن يشتمل النموذج على سلسلة من الأحرف "X" ، والتي يتم استبدالها بعدد مماثل من الأحرف والأرقام العشوائية. كلما زادت سلسلة الأحرف "X" ، زادت سلسلة الأحرف العشوائية. هنا مثال:

tempfile = $ (mktemp /tmp/foobar.$$.XXXXXXXXXX)

يؤدي هذا إلى إنشاء ملف مؤقت وتخصيص اسمه للمتغير ملف مؤقت. يتم استبدال الأحرف "X" في النموذج بأحرف وأرقام عشوائية بحيث يكون اسم الملف النهائي (والذي ، في هذا المثال ، يتضمن أيضًا القيمة الموسعة للمعامل الخاص $$ للحصول على PID) قد يكون شيئًا مثل:

/tmp/foobar.6593.UOZuvM6654

بالنسبة للنصوص التي يتم تنفيذها بواسطة مستخدمين عاديين ، قد يكون من الحكمة تجنب استخدام امتداد / تمة الدليل وإنشاء دليل للملفات المؤقتة داخل الدليل الرئيسي للمستخدم ، مع سطر من التعليمات البرمجية مثل هذا:

[[-d $ HOME / tmp]] || mkdir $ HOME / tmp


أفضل الحوسبة السحابية لنظام التشغيل في OnWorks: