هل هناك طريقة لاستخدام Errno بأمان في تطبيق متعدد الخيوط؟ [مكرر
سؤال
هذا السؤال لديه بالفعل إجابة هنا:
- هل Errno Thread-Safe؟ 8 إجابات
إذا كنت تكتب تطبيقًا متعدد الخيوط يستخدم مكالمات النظام/المكتبة التي تستخدم Errno للإشارة إلى نوع الخطأ ، هل هناك طريقة آمنة لاستخدام Errno؟ إذا لم يكن الأمر كذلك ، فهل هناك طريقة أخرى للإشارة إلى نوع الخطأ الذي حدث بدلاً من مجرد حدوث خطأ؟
المحلول
إذا كانت مكتبتك القياسية على دراية بمتعدد مؤشرات الترابط ، فمن المحتمل أن يكون لها ملف #define
هذا يتغير errno
في استدعاء دالة تقوم بإرجاع قيمة إرجاع خطأ في مؤشر الترابط المحلي. ومع ذلك ، لاستخدام هذا أنت بشكل عام يجب تضمن <errno.h>
, ، بدلا من الاعتماد على extern
إعلان.
لقد وجدت مقالا سلامة الموضوع و posix.1 الذي يعالج هذا السؤال بالذات.
نصائح أخرى
man errno
يقول:
يتم تعريف Errno بواسطة معيار ISO C ليكون lvalue قابل للتعديل من النوع int ، ويجب عدم الإعلان عنه بشكل صريح ؛ قد يكون Errno ماكرو. errno هو الخيط المحلي. لا يؤثر إعداده في مؤشر ترابط واحد على قيمته في أي مؤشر ترابط آخر.