Antworten auf Fragen im Kopf: Ja, das ist für die Schule. Nein, ich kann dafür keine Threads verwenden. Und ja, ich suchte nach einer Antwort und einige Leute sagten “ja” und andere sagten “nein”. Ich überprüfe auch die Fakten meines Professors, weil ich nicht unfairerweise Punkte verlieren möchte, wenn jemand anderes es benoten würde und sie verlangen, dass dies “korrigiert” wird.
Betrachten Sie dieses einfache Programm für c auf dem Linux-System. Ich mallociere etwas und forke dann. Ich habe mein Projekt auf das genaue Problem reduziert:
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/types.h>
int main( void )
{
char * args [] = { "someinvalidcommand", NULL };
// malloc before the fork (happens in parent process)
char * something = (char *)malloc(sizeof(char));
pid_t child_pid = fork();
// are there now two things that need to be freed:
// one for each process?
if(child_pid == 0) // child process
{
//free(something); // is this needed?
// execvp (it won't return if succeeded)
if(execvp(args[0], args) < 0)
{
// or do I only need to free it here?
printf("%s: No such file or directory\n", args[0]);
/*
* EDIT: Calling it here seems to fix the issue. It turns out
* that the system calls were the ones with the "still reachable"
* errors, so I guess it's not all that important that the
* memory be freed.
*
* free(something)
*/
_exit(1);
}
}
else // parent process
{
int status;
while(wait(&status) != child_pid);
if(status != 0)
{
printf("command status: %i\n", WEXITSTATUS(status));
}
}
free(something);
return 0;
}
Hier ist es jetzt etwas verwirrend. Meines Wissens erstellt Fork eine exakte Kopie des übergeordneten Prozesses in diesem bestimmten Zustand (einschließlich Text, Daten usw.). Ich habe irgendwo gelesen, dass dies alles enthält, was malloc’d ist (also den Haufen). Ich habe jedoch an anderer Stelle gelesen, dass dies aufgrund von etwas namens “Copy-on-Write” nicht der Fall ist, aber dann habe ich an anderer Stelle gelesen, dass “Copy-on-Write” einfach eine Optimierung ist, die transparent und irrelevant ist. Aber was ich dann am sinnvollsten gelesen habe, war, dass es, da es sich um eine KOPIE handelt, sein eigenes, na ja … alles hat.
Aber dann erinnere ich mich, dass bei Verwendung von fork() alles, was mallociert wurde, dieselbe Speicheradresse enthält, also zeigen Eltern und Kind auf dasselbe? Muss ich auch beim Kind Ressourcen freisetzen? Werden nur die Pointer kopiert oder werden auch die Daten kopiert, auf die die Pointer zeigen?
Ich habe valgrind verwendet und wenn der untergeordnete Prozess beendet wird, beschwert er sich einfach, dass der gesamte Speicher noch erreichbar ist. Wie genau ist es “noch erreichbar”? Beantwortet die Tatsache, dass es “immer noch erreichbar” ist, meine Frage und sagt es, dass Elternteil und Kind auf dasselbe zeigen und der Elternteil der einzige ist, der für die Freigabe des Speichers verantwortlich ist?
Dieser Thread erklärt, stackoverflow.com/questions/4597893/…
– MM
3. Mai 2014 um 4:17 Uhr
Ich würde vorschlagen, Ihr Betriebssystem in Ihren Kommentar oder Ihre Tags einzufügen
– MM
3. Mai 2014 um 4:22 Uhr