سؤال

وأعمل على كود شيئا من هذا القبيل

... HEADERS ...

int *var;

void child() {
  ... //some work
  free(var);
  exit(EXIT_SUCCESSFUL);
}

int main(void) {
  ...
  //allocate variable
  var = (int *) malloc(N*sizeof(int));
  ... //work with var

  for(int i; i<PROC_COUNT; i++) {
    pid_t child = fork();
    if(pid == 0) {
      child(); //main function of new proces
      break;
    }
    elseif(pid < 0) {
      //there is enormous problem -> kill every proces
      kill(0, SIGTERM);
      waitpid(0, NULL, 0); //wait for children
      free(var);
      exit(EXIT_FAILURE);
    }

  }
  free(var);
  return EXIT_SUCCESS;
}

وعندما يتم متشعب العملية، يتم استنساخ جميع المتغيرات أيضا. في حالة العادية يتم الافراج عن جميع نسخ فار.

إذا كان هناك خطأ من قبل fork()، وإرسال إشارة SIGTERM لجميع العمليات التي تم إنشاؤها. ولست بحاجة لكتابة معالج إشارة لSIGTERM التي الحر فار وإنهاء التطبيق. ومع ذلك، مجانا () ليست signal safe function - لذلك أنا شولدن نسميها. ولكن كيف لتحرير () هذا المتغير؟

وهناك الكثير من الشكر على إجاباتك ...

وتحرير: يظهر valgrind أيضا لا تزال متغير reacheable:

==5928== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 15 from 1)
==5928== malloc/free: in use at exit: 20 bytes in 1 blocks.
==5928== malloc/free: 1 allocs, 0 frees, 20 bytes allocated.
==5928== For counts of detected errors, rerun with: -v
==5928== searching for pointers to 1 not-freed blocks.
==5928== checked 49,164 bytes.
هل كانت مفيدة؟

المحلول

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

وهناك لا وجود بيئات حيث لا تعمل برامج C في العمليات، وحيث عليك أن تكون حذرا جدا ما يمكنك ترك الكذب حولها في الخروج. ولكن تلك البيئات ليست POSIX، ولن تدعم شوكة (). قد لا تدعم الإشارات، لهذه المسألة. إذا كنت تكتب عن أي من هذه البيئة غير عادية، والتحقق من الوثائق الخاصة بك ...

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

نصائح أخرى

وأنا قد يكون سوء فهم شيء، ولكن بالتأكيد بعد SIGTERM سوف تختفي العملية برمتها، مع متغير مع ذلك؟

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

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