mal ein paar Fragen zu fork()
-
schiff ahoi!
bevor ich meine Fragen stell, erstmal mein Code:int main(int argc, char **argv) { int i; pid_t child; /* der ominöse erste IF-Block */ if (argc >= 2) { if (strcmp(argv[1], "--help") == 0) { print_usage(); return 0; } if (strcmp(argv[1], "--version") == 0) { print_version(); return 0; } if (strcmp(argv[1], "-preview") == 0 && argc == 3) { nl_send_sample(argv[2]); return 0; } printf("invalid option.\ntype '%s --help' for help\n", PACKAGE); return 0; } printf("%s v%s started ...\n", PACKAGE, VERSION); /* MAXCHILDS ist 5 */ for (i=1; i <= MAXCHILDS; i++) { if ((child == fork()) == 0) { handle_fork(i); printf("=C[%d]=: child terminated\n", i); return 0; } if (child == -1) { printf("=P=: could not fork() new child!\n"); return 1; } } while (0 == waitpid(child, NULL, WNOHANG)) { sleep(1); } printf("%s main program gracefully finished. have a nice day ;)\n", PACKAGE); exit(0); } /** * handle new fork()'ed childs */ static int handle_fork(int i) { printf("=C[%d]=: forking new child with PID=%d\n", i, getpid()); sleep(5); return 0; }
alles zwischen dem Aufruf von fork(); und return; ist quasi der "Programm-Code" für den Child-Prozess, oder?
Wenn es so ist, dann check folgendes Verhalten nicht:wenn ich den ersten IF-Block drin habe, dann werden nur 2 Child-Prozesse ge-forck()'t und zwar so:
me@tux nlsend $ src/nlsend nlsend v0.0.1 started ... =C[1]=: forking new child with PID=6325 =C[1]=: forking new child with PID=6324 =C[1]=: child terminated =C[1]=: child terminated
sobald ich den ersten IF-Block rauslösche, läuft es wie ich es eigentlich haben will. Es werden korrekt viele Child-Prozesse erstellt (nämlich 5):
me@tux nlsend $ src/nlsend nlsend v0.0.1 started ... =C[3]=: forking new child with PID=6384 =C[2]=: forking new child with PID=6383 =C[1]=: forking new child with PID=6382 =C[4]=: forking new child with PID=6385 nlsend main program gracefully finished. have a nice day ;) =C[5]=: forking new child with PID=6386 =C[5]=: child terminated =C[3]=: child terminated =C[2]=: child terminated =C[4]=: child terminated =C[1]=: child terminated
also scheint es für mich so, dass der Child-Prozess auch noch den Code VOR dem fork(); ausführt. Also irgendwie raff ich das nicht, eventuell hab ich auch die FUnktionsweise von fork(); nich verstanden?
Trinity, help!
/DetleFF
-
if ((child == fork()) == 0) {
Da ist zumindest ein = zuviel.
-
uhm krass, an dem lags jetzt auch 0_o
nu funktionierts auch mit dem IF-Block dran, so wie ichs wolltetausend Dank!
-
Hi Leute
Ich weiss hat jetzt nichts mit dem Thema zu tun, aber das muss ich jetzt ma loswerden:
Ich wollt ma ponto grüssen und loben, da er mir (und auch anderen) schon mehrmals
mit seinen kompetenten Hilfen aus der Kleme geholfen hat :), ob einfach oder
(meiner Meinung nach) shweer. Grussps:Doch nicht zu vernachlässigen Die Anderen,
die mir schon mehrmals geholfen haben. Vielen Dank auch an Sie
-
LOL
-
Hi ich hab auch ma 2 fragen zu fork:
1.)Wenn ich mitels pipe pipes erzeuge, wobei der parent prozess der schreibende ist,
sind dann ale child-prozesse in der lage daraus zu lesen? Wenn ja, dann ist das so, wenn ein childprozess diesen datensatz bereitz rausgeholt hat, der nächste
ihn dan nicht mehr lesen kann (das will ich erreichen)?
2.)Wenn ne variable ein pointer, mit ner bestimmten addr als inhalt, ist.
Und dann geforkt wird, kann der childprozess dann auf den gleichen speicherbereich
zugreifen (mitels des pointers) wie der parentprozess? Oder zeigt die addr
auf ne andere speicherstell im virtuellen speicher?
-
linu(x)bie schrieb:
Hi ich hab auch ma 2 fragen zu fork:
1.)Wenn ich mitels pipe pipes erzeuge, wobei der parent prozess der schreibende ist,
sind dann ale child-prozesse in der lage daraus zu lesen? Wenn ja, dann ist das so, wenn ein childprozess diesen datensatz bereitz rausgeholt hat, der nächste
ihn dan nicht mehr lesen kann (das will ich erreichen)?ja, ja.
2.)Wenn ne variable ein pointer, mit ner bestimmten addr als inhalt, ist.
Und dann geforkt wird, kann der childprozess dann auf den gleichen speicherbereich
zugreifen (mitels des pointers) wie der parentprozess? Oder zeigt die addr
auf ne andere speicherstell im virtuellen speicher?ja, nein.
-
linu(x)bie schrieb:
2.)Wenn ne variable ein pointer, mit ner bestimmten addr als inhalt, ist.
Und dann geforkt wird, kann der childprozess dann auf den gleichen speicherbereich
zugreifen (mitels des pointers) wie der parentprozess? Oder zeigt die addr
auf ne andere speicherstell im virtuellen speicher?Der Pointer ist der gleiche und er zeigt auf den gleichen Inhalt. Wenn jedoch der Parent oder das Child den Inhalt ändert, gilt diese Änderung nur beim ändernden Prozess.
-
@SGI danke
SG1 schrieb:
linu(x)bie schrieb:
Wenn ne variable ein pointer, mit ner bestimmten addr als inhalt, ist.
Und dann geforkt wird, kann der childprozess dann auf den gleichen speicherbereich
zugreifen (mitels des pointers) wie der parentprozess? Oder zeigt die addr
auf ne andere speicherstell im virtuellen speicher?ja, nein.
Kann ich dann das so verstehen, dass die Speicherstelle als Schnittstelle
zwischen diesen parentprozess und den childprozess dienen kann? Oder ist der Speicherbereich irgendwie geschützt? Wenn das funktionieren würde,
da kann ich mir die pipes ja sparenthx
-
Ponto schrieb:
linu(x)bie schrieb:
2.)Wenn ne variable ein pointer, mit ner bestimmten addr als inhalt, ist.
Und dann geforkt wird, kann der childprozess dann auf den gleichen speicherbereich
zugreifen (mitels des pointers) wie der parentprozess? Oder zeigt die addr
auf ne andere speicherstell im virtuellen speicher?Der Pointer ist der gleiche und er zeigt auf den gleichen Inhalt. Wenn jedoch der Parent oder das Child den Inhalt ändert, gilt diese Änderung nur beim ändernden Prozess.
achso da war meine Hoffnung vergebens
-
linu(x)bie schrieb:
Ponto schrieb:
Der Pointer ist der gleiche und er zeigt auf den gleichen Inhalt. Wenn jedoch der Parent oder das Child den Inhalt ändert, gilt diese Änderung nur beim ändernden Prozess.
achso da war meine Hoffnung vergebens
Ich würde bei den Pipes bleiben. Sie sind einfach, effizient und man kann eigentlich nichts falsch machen. Es gibt noch viele andere Möglichkeiten der Interprozess Kommunikation (IPC), auch welche, die über gleichen Speicher gehen, aber das ist dann meistens komplizierter. Vor allem wenn man sich zusätzlich um die synchronisation kümmern muss, kann man froh sein, dass das der Kernel bei den Pipes für einen macht.
-
Eine ganze Menge zu fork(), Pipes, FIFOs, Shared Memory, Threads usw. findest du - an vielen Beispielen gerade für Einsteiger erklärt - auch in dem Buch "C und Linux"
Martin