Frage

Betrachten Sie dieses sinnlose Programm:

/* main.c */

#include <stdlib.h>
#include <unistd.h>

int main(int argc, char **argv) {
    int i;
    for (i = 0; i < 1024; i++) {
        int pid = fork();
        int status;
        if (pid) {
            wait(&status);
        }
        else {
            char *ptr = (char *)malloc(1024*sizeof(char));
            char *args[2] = {"Hello, world!", NULL};
            execve("/bin/echo", args, NULL);
        }
    }
}

wäre nicht befreien ptr einen Speicherverlust für beide main.c oder das andere Programm darstellen, oder ist es trotzdem gehen zu befreien, wenn execve genannt wird?

War es hilfreich?

Lösung

Nein.

Dies ist kein Speicherleck. exec*() wird eine lokale Kopie der String-Daten in dem args-Array machen, dann das Kind Prozess Speicherbild wegblasen und überlagern sie mit dem Speicherbild von /bin/echo verwendet. Im Grunde alles, was bleibt nach der exec () ist die pid.

Edit:

gebracht User318904 den Fall exec up () liefert -1 (das heißt, Fehler). In diesem Fall, dass das Kind Prozess gegabelt hat aber zu exec gescheitert ist, hat in der Tat technisch ein Speicherleck, sondern als die übliche Reaktion auf einen gescheiterten exec sowieso das Kind Prozess nur zu verlassen, wird der Speicher durch das Betriebssystem zurückgewonnen werden. Dennoch ist es zu befreien ist wahrscheinlich in eine gute Gewohnheit zu bekommen, wenn aus keinem anderen Grund, als dass es Sie fragen, darüber zu halten wird später.

Andere Tipps

Wenn execve -1 zurück, ja. Ansonsten vielleicht.

Der zugeordnete Speicher sollte von exec befreit werden. Nachdem der Anruf beendet man es sowieso nicht zugreifen kann.

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