Frage

ich auf Code funktioniert so etwas wie dieses

... 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;
}

Beim Prozess gegabelt ist, werden alle Variablen zu geklont. In regelmäßigen Fall alle Kopien von var sind befreit.

Wenn es Fehler durch fork() ist, I-Signal SIGTERM an alle bestehenden Prozesse senden. Und ich brauche, um Signal-Handler für SIGTERM, die frei var und beenden Anwendung zu schreiben. Jedoch frei () ist nicht signal safe function - so ich shouldn es nennen. Aber wie zu befreien () die Variable?

Vielen Dank für Ihre Antworten ...

EDIT: valgrind zeigt auch noch reacheable Variable:

==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.
War es hilfreich?

Lösung

Ich bezweifle, dass Sie benötigen. Jedes Betriebssystem, das unterstützt fork (), wird auch automatisch kostenlose Zuteilung von malloc (), wenn ein Prozess beendet, unabhängig davon, wie es sich so (auch bei Abbruch).

Es existieren Umgebungen, in denen C-Programme laufen nicht in Prozessen und wo man sehr vorsichtig sein, was Sie liegen lassen bei der Ausfahrt. Aber diese Umgebungen sind nicht POSIX und werden nicht unterstützt fork (). Sie könnten nicht Signale unterstützen, was das betrifft. Wenn Sie sich für solche ungewöhnlichen Umgebung zu schreiben, überprüfen Sie die Dokumentation ...

Wenn Sie einen sauberen valgrind Bericht sehen wollen, dann könnte man die Prozedur ein Ereignis in die Kinderereignisschleife hat Stick (oder einen Flag gesetzt und eine Semaphore posten, oder was auch immer), und das Ereignis als eine saubere Ausfahrt verarbeiten. Das ist auch das, was würden Sie tun, wenn Ihr Programm eine interaktive Anwendung war und man wollte die Daten des Benutzers auf einem SIGTERM speichern, Ihre UI-Framework unter der Annahme, bereits nicht SIGTERM zu einem Ereignis für Sie übersetzen.

Andere Tipps

ich etwas sein Missverständnis, aber sicher nach SIGTERM wird der gesamte Prozess verschwindet, nimmt Ihre Variable damit?

Sie können exec das Kind Prozess vom Haupt eher zu beginnen, als das Kind () Funktion direkt aufrufen. Verwenden Argument einer Befehlszeile des Kind Programm zu informieren, die Arbeit in Haupt zu tun. Dann wird das Kind Prozess richtig Bereinigung der Lage sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top