أي فائدة في استخدام WEXITSTATUS الكلي في ج على شعبة من 256 على الخروج() الحالة ؟

StackOverflow https://stackoverflow.com/questions/808541

  •  03-07-2019
  •  | 
  •  

سؤال

كنت أقوم ممارسة الجامعة حيث اضطررت إلى العودة قيمة مع خروج تلك القيمة في الواقع عدد من شيء.هذا يمكن أن يكون فوق 255 (التي exit() لا يمكن معالجة) ولكن المعلم اقترح استخدام اختبار البيانات حيث عد أن لا تتجاوز هذه القيمة.

بعد كل هذا, أنا في حاجة إلى التعامل مع هذا العدد القيمة ، حالة خروج حصلت هذه القيمة في العملية الرئيسية باستخدام waitpid().لدهشتي, إذا كان الطفل عملية إرجاع 1, "الحقيقي" القيمة الرئيسية في عملية 256-2 512 وهكذا...

كنت بحاجة إلى طباعة هذه القيمة لذلك أنا ببساطة تنقسم 256 و تم القيام به.ومع ذلك ، إذا كنت تستخدم WEXITSTATUS() ماكرو, سوف أيضا الحصول على هذه القيمة التي أريدها...

نظرت إلى التعليمات البرمجية المصدر C و هذا ما وجدت:

#define __WEXITSTATUS(status) (((status) & 0xff00) >> 8)

أنا أفهم ما يحدث هنا ، على سبيل المثال ، 512 الثنائية هو 10 0000 0000, تحويل 8: الحق في إعطاء 00 0000 0010 ، وهو 2 في عشري.ما أنا لا أفهم في هذه الكلية هو أن & مشغل حقيقة أن 0xff00 يبدو رقم عشوائي (وربما لم يكن ، حيث أنها لا تأتي من؟).ماذا يفعل هذا بالضبط لماذا هناك "& 0xff00" في ماكرو ؟ لن يجدي مع من ؟

و السؤال الحقيقي في هذا الموضوع هو نفس الشيء أن نطلق على هذا الماكرو في قانون بلدي كما قسمة 256?

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

المحلول

<اقتباس فقرة>   

والسؤال الحقيقي في هذا الموضوع،   هو نفس الشيء لاستدعاء هذا الماكرو   في قانون بلدي كما قسمة 256؟

ومن المرجح أن تعمل دائما في الحالات التي يكون فيها إنهاء العملية الطفل عادة (أي عن طريق الاتصال خروج ()، وليس عن طريق خطأ تجزئة، وعدم التأكيد، الخ.).

وحالة تخزينها من قبل waitpid() بترميز كل من السبب الذي تم إنهاء عملية طفل ورمز للخروج. يتم تخزين السبب في البايت الأقل معنويا (التي حصلت عليها status & 0xff)، ويتم تخزين رمز الخروج في البايت التالي (من قبل ملثمين status & 0xff00 واستخراجها من قبل WEXITSTATUS()). عند إنهاء العملية بشكل طبيعي، والسبب هو 0 وهكذا WEXITSTATUS ما يعادل فقط لتحويل بنسبة 8 (أو قسمة 256). ومع ذلك، إذا تم قتل هذه العملية عن طريق إشارة (مثل SIGSEGV)، لا يوجد رمز إنهاء، وكان لديك لاستخدام WTERMSIG لاستخراج عدد من إشارة السبب بايت.

نصائح أخرى

إذا متغير الوضع غير موقعة 16 بت عدد صحيح (أ 'القصير') على جهاز حيث 'الباحث' هو كمية 32 بت، وإذا كانت حالة خروج في نطاق 128..255، ثم WEXITSTATUS () لا يزال يوفر لك القيمة الصحيحة حيث قسمة 256 أو ببساطة تحويل الحق سوف تعطيك قيمة غير صحيحة.

وذلك لأن باختصار سيتم التوقيع تمتد إلى 32 بت، واخفاء يبطل التمديد علامة، وترك الصحيحة قيمة (الإيجابية) في النتيجة.

وإذا كان الجهاز يستخدم الأعداد الصحيحة 16-بت، ثم رمز في WEXITSTATUS () ربما لا SHIFT ثم قناع لضمان سلوك مماثل:

#define WEXITSTATUS(status) (((status)>>8) & 0xFF)

ولأن تنفيذ يعتني مثل هذه التفاصيل لأنك يجب أن تستخدم الماكرو WEXITSTATUS ().

بقدر ما أستطيع أن أقول من التحقق واحدة Unix المواصفات ، الخاص بك نظام يحدث لتخزين حالة خروج في الثانية-إلى-اليمين الثماني ، ولكن لا أعتقد القياسية لا.لذا يجب استخدام وحدات الماكرو على الأقل عدد قليل من الأسباب:

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

وهنا 0xff00 هو قناع ثنائي ( ربط النص ). اندينج مع قيمة يحدد كل بت إلى الصفر، باستثناء البايت الثاني (العد من اليمين).

ويجب عليك فقط استخدام WEXITSTATUS على العملية التي من المعروف أن خرجت بشكل طبيعي. وتعطى هذه المعلومات عن طريق الماكرو WIFEXITED.

<اقتباس فقرة>   

والسؤال الحقيقي في هذا الموضوع، هو نفس الشيء لاستدعاء هذا الماكرو في التعليمات البرمجية بصفتي قسمة 256؟

والماكرو يجعل رمز أكثر قابلية للقراءة، وانها يمكن ضمان ذلك للعمل على تنفيذ أي POSIX المتوافقة. وبقدر ما أعرف POSIX لا يحدد شكل من الوضع، لذلك لا يمكن أن نتوقع التعليمات البرمجية للعمل في كل مكان.

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