حالة غريبة للتفرع غير المتوقع في fork()
خذ بعين الاعتبار مقتطف التعليمات البرمجية التالي الذي يستخدم fork() البدائية لإنشاء عمليات فرعية:
#include
#include
#include
int main(void)
{
int i;
for(i = 0; i من المثير للدهشة أن تنفيذ هذا البرنامج ينتج عنه ثماني نقاط إخراج، أي ستة أكثر مما قد تتوقعه في البداية. لماذا يحدث هذا؟
الكشف عن العمليات المخفية
لكشف هذا اللغز، دعونا نتعمق في تشغيل fork(). fork() تنشئ نسخة طبق الأصل من العملية الحالية، مما يؤدي إلى عملية أصل وعملية فرعية.
في البداية، هناك عملية واحدة، والتي تتفرع إلى عمليتين. تقوم كلتا العمليتين بتنفيذ حلقة for بشكل تدريجي، وطباعة نقطة في كل مرة. في التكرار الثاني، تتفرع كل عملية مرة أخرى، مما يؤدي إلى إنشاء إجمالي أربع عمليات. تقوم هذه العمليات الأربع بطباعة نقطة قبل الإنهاء.
المخرجات المخزنة والمظهر المؤجل
ومع ذلك، تقوم printf() بتخزين مخرجاتها مؤقتًا، مما يعني أنها تتراكم مطبوعات متعددة قبل إرسالها. مرة واحدة. عندما تطبع العمليات الأربع نقاطها الثانية، يتم تخزينها مؤقتًا. هذا هو المكان الذي ينشأ فيه التأثير الخادع.
عند fork ()، يتم توريث النقاط المخزنة مؤقتًا بواسطة العمليات الفرعية. لذلك، عند خروج كل عملية فرعية، تظهر نقطتها المخزنة مؤقتًا على دفق الإخراج. تؤدي إضافة هذه النقاط الأربع المؤجلة إلى النقاط الأربع المطبوعة بشكل متزايد إلى إجمالي غير متوقع وهو ثماني نقاط.تجنب النقاط المخزنة مؤقتًا
لتجاوز هذا السلوك المخزن مؤقتًا، يُنصح بالاتصال fflush(stdout); بعد كل عبارة printf(). وهذا يفرض إرسال المخرجات على الفور، مما يضمن عرض العدد المتوقع من النقاط.
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3