Pregunta

Tenga en cuenta este programa sin sentido:

/* 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);
        }
    }
}

¿No liberando ptr constituye una pérdida de memoria, ya sea para main.c o el otro programa, o va a ser liberado de todos modos cuando execve se llama?

¿Fue útil?

Solución

n.

Esto no es una pérdida de memoria. exec*() hará una copia local de los datos de cadena de la matriz args, a continuación, la imagen de memoria proceso hijo golpe de distancia y la cubrirás la imagen de memoria utilizada por /bin/echo con. Esencialmente todo lo que queda después de la exec () es el pid.

Editar:

User318904 crió el caso de exec () devolver -1 (es decir, fallo). En este caso, el proceso hijo que ha bifurcado, pero no para Exec, de hecho técnicamente tienen una pérdida de memoria, pero a medida que la respuesta habitual a un ejecutivo no es sólo para salir del proceso hijo de todos modos, la memoria será reclamado por el sistema operativo. Aún así, la liberación es probable que sea un buen hábito para entrar, si no por otra razón que el que le mantendrá de preguntarse sobre ello más adelante.

Otros consejos

Cuando vuelve execve -1, sí. De lo contrario, tal vez.

La memoria asignada debe ser liberada por exec. Después de que la llamada se completa no se puede acceder a él de todos modos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top