سؤال

عادة عندما أحتاج إلى تفرع في لغة C، أفعل شيئًا مثل هذا:

pid_t p = fork();
if(p == 0) { /* do child stuff */ }
else { /* do parent stuff and pray there wasn't an error */ }

خطر لي أنه يمكنني التخلص من المتغير الإضافي واستخدام:

if(fork() == 0) { /* child */ }
else { /* parent/pray */ }

بغض النظر عن التعامل مع الأخطاء بشكل غير لائق، (لماذا) هل يعمل/لا يعمل هذا؟

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

المحلول

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

switch (pid = fork()) {
case -1:       /* Failure */
  /* ... */
case 0:        /* Child */
  /* ... */
default:       /* Parent */
  /* ... */
}

نصائح أخرى

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

أيضًا، يتم إرجاع -1 إذا كان هناك خطأ في التفرع، وهو ما لا تختبره في كلتا الحالتين، وهو عادةً خطأ.

يجب عليك أن تفعل هذا بدلا من ذلك.لم أكن أعرف أبدا أنه لا يعمل.هكذا يتم الأمر في كتب ستيفنز.

int p;
if((p = fork()) == 0) { /* child */ }
else { /* parent/pray */ }

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

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