lima~
2010-05-04, 23:06:47
Hallo!
Muss mich gerade gezwungenermaßen mit Systemcalls und ähnlichem aus C heraus beschäftigen, wobei ich bisher weder mit C, noch mit Linux gearbeitet habe. Ein Grundverständnis was Programmierung angeht ist zwar vorhanden, das hilft mir hier aber nur bedingt weiter. Ergo: auch wenn ihr unterm Tisch liegt, die folgenden Fragen sind durchaus ernst gemeint.
1. Was ich von fork bisher grob weiß: der Befehl erzeugt aus dem aktuellen Prozess heraus (Vater) einen neuen Prozess (Sohn), welcher auf alle Daten (Variablen) des Vaterprozesses zugreifen kann. so sind sich die Prozesse ziemlich ähnlich (oder gar identisch?), allerdings wird natürlich eine neue PID zugewiesen. Stimmt das soweit?
2. Sobald fork einmal aufgerufen wurde, kann man danach mit exec (oder einer seiner Varianten) ein neues Programm in den Prozess laden, z.B. Firefox, KWrite oder whatever. Auch noch grob richtig?
3. Gut, spätestens an diesem Punkt hänge ich ab. Für mich ist es im Code absolut untransparent, an welcher Stelle jetzt Vater- und an welcher Stelle Sohnprozes werkeln. Ich habe dazu folgenden code:
switch (fork())
{
case -1:
cout << "Fehler bei fork" << endl;
existat = 1; break;
case 0: /* nur Sohn */
execl("/bin/rm","rm",argv[1],0); /* nur Sohn */
cout <<"Fehler beim Laden"<<endl; /* nur Sohn */
existat = 2; break; /* nur Sohn */
default:
if(wait(&status) < 0 || status != 0)
{
cout << "Problem beim Loeschen" << endl;
cout << "Dateiname: " << argv[1] << endl;
cout << "status = " << status << endl;
existat = 3;
}
}
So, wie man sieht ist der case 0 mit "nur Sohn" Kommentaren beschmückt. Warum sollte jetzt aber ausgerechnet nur exakt der case 0-Teil im Sohn-Prozess ausgeführt werden? gut, bei -1 und default konnte der Sohnprozess garnicht erst gestartet werden und folglich kann auch nichts darin ausgeführt werden, ich frage mich aber trotzdem, wie einem ersichtlich wird, dass case 0 "Sohn-only" ist und just bei break; wieder aufhören soll.
Falls dem so ist: was müsste man tun, wenn man in case 0 auch Code im Vaterprozess ausführen lassen wollte? Vor das exec schreiben?
4. Ebenfalls wichtiger Punkt: case 0 ist ja eigentlich Erfolgsfall. Dort ist aber zu lesen "Fehler beim laden". Ich bin mir sicher, dass das aufgrund der Vater-Sohn Geschichte schon seinen Grund hat, komme aber nicht dahinter. Vermutlich wird das coutr garnicht mehr ausgegeben, falls exec erfolgreich ist oder so ähnlich... aber eine genaue Begründung fällt mir nicht ein.
5. Okay, letzte Frage:
Habe hier im Skript stehen: fork() ist parameterlos und liefert beim Vater als Rückgabewert die PID des Sohnes, und beim Sohn den Wert 0.
Wie ist das zu interpretieren? Schließlich rufe ich doch oben im Code fork auf und switche durch dessen Rückgabewert (-1, 0, default) und nicht etwa durch eine PID, obwohl der switch doch offensichtlich im Vater stattfindet? Und wie soll der Sohn überhaupt an den Rückgabewert kommen (ich meine weil der oben erwähnte Satz zwischen Vater und Sohn unterscheidet).
Danke vielmals!
Muss mich gerade gezwungenermaßen mit Systemcalls und ähnlichem aus C heraus beschäftigen, wobei ich bisher weder mit C, noch mit Linux gearbeitet habe. Ein Grundverständnis was Programmierung angeht ist zwar vorhanden, das hilft mir hier aber nur bedingt weiter. Ergo: auch wenn ihr unterm Tisch liegt, die folgenden Fragen sind durchaus ernst gemeint.
1. Was ich von fork bisher grob weiß: der Befehl erzeugt aus dem aktuellen Prozess heraus (Vater) einen neuen Prozess (Sohn), welcher auf alle Daten (Variablen) des Vaterprozesses zugreifen kann. so sind sich die Prozesse ziemlich ähnlich (oder gar identisch?), allerdings wird natürlich eine neue PID zugewiesen. Stimmt das soweit?
2. Sobald fork einmal aufgerufen wurde, kann man danach mit exec (oder einer seiner Varianten) ein neues Programm in den Prozess laden, z.B. Firefox, KWrite oder whatever. Auch noch grob richtig?
3. Gut, spätestens an diesem Punkt hänge ich ab. Für mich ist es im Code absolut untransparent, an welcher Stelle jetzt Vater- und an welcher Stelle Sohnprozes werkeln. Ich habe dazu folgenden code:
switch (fork())
{
case -1:
cout << "Fehler bei fork" << endl;
existat = 1; break;
case 0: /* nur Sohn */
execl("/bin/rm","rm",argv[1],0); /* nur Sohn */
cout <<"Fehler beim Laden"<<endl; /* nur Sohn */
existat = 2; break; /* nur Sohn */
default:
if(wait(&status) < 0 || status != 0)
{
cout << "Problem beim Loeschen" << endl;
cout << "Dateiname: " << argv[1] << endl;
cout << "status = " << status << endl;
existat = 3;
}
}
So, wie man sieht ist der case 0 mit "nur Sohn" Kommentaren beschmückt. Warum sollte jetzt aber ausgerechnet nur exakt der case 0-Teil im Sohn-Prozess ausgeführt werden? gut, bei -1 und default konnte der Sohnprozess garnicht erst gestartet werden und folglich kann auch nichts darin ausgeführt werden, ich frage mich aber trotzdem, wie einem ersichtlich wird, dass case 0 "Sohn-only" ist und just bei break; wieder aufhören soll.
Falls dem so ist: was müsste man tun, wenn man in case 0 auch Code im Vaterprozess ausführen lassen wollte? Vor das exec schreiben?
4. Ebenfalls wichtiger Punkt: case 0 ist ja eigentlich Erfolgsfall. Dort ist aber zu lesen "Fehler beim laden". Ich bin mir sicher, dass das aufgrund der Vater-Sohn Geschichte schon seinen Grund hat, komme aber nicht dahinter. Vermutlich wird das coutr garnicht mehr ausgegeben, falls exec erfolgreich ist oder so ähnlich... aber eine genaue Begründung fällt mir nicht ein.
5. Okay, letzte Frage:
Habe hier im Skript stehen: fork() ist parameterlos und liefert beim Vater als Rückgabewert die PID des Sohnes, und beim Sohn den Wert 0.
Wie ist das zu interpretieren? Schließlich rufe ich doch oben im Code fork auf und switche durch dessen Rückgabewert (-1, 0, default) und nicht etwa durch eine PID, obwohl der switch doch offensichtlich im Vater stattfindet? Und wie soll der Sohn überhaupt an den Rückgabewert kommen (ich meine weil der oben erwähnte Satz zwischen Vater und Sohn unterscheidet).
Danke vielmals!