Wäre dies ein Speicherleck in Betracht gezogen werden?
-
04-10-2019 - |
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?
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.