fork, kindprozesse aufzählen?
-
int variable; while(true) { variable++; if(fork()==0) { //SOHN variable--; exit(0); } else { //VATER } }Hallo! Ich möchte gerne die variable des Vaters aus dem sohn verändern um die kindprozesse aufzuzählen. Wie geht das?
-
Das müsstest du über Shared-Memory machen. Ansonsten kann der Vater einfach seine Kinder selbst zählen.
-
Wie denn? Mit wait wartet er doch euf jeden einzelnen Kind. Ich möchte aber mehrere starten.
-
Wenn du eh nur zählst erhöhe die Variable doch einfach im Vater.
P.S. es gibt nicht nur eine wait()-Funktion.
-
Hallo neoexpert,
Also ich vermute mal du willst n Kindprozesse starten und im Vaterprozess überwachen, ob sie noch laufen?
Wenn ja, dann würde ich das so machen:
int variable; int pids[n]; int child = 0; //Feld vorbelegen for(int i=0; i<n; i++){ pids[i] = 0; } for(int i=0; i<n; i++){ int pid_tmp = fork(); if(pid_tmp < 0){ cout<<"Error in fork"<<endl; exit(1); } else { if(pid_tmp == 0){ pids[i] = pid_tmp; } else { child = 1; } } } if(child == 0){ for(int i=0; 1==1; i++) { if(i==n){ i=0; } if((wpid = waitpid(pids[i], &childstatus, WNOHANG) < 0){ cout<<"Error in waitpid"<<endl; exit(2); } else { if(childstatus == 0){ cout<<"Pid is running"<<endl; } else { int pid_tmp = fork(); if(pid_tmp < 0){ cout<<"Error in fork"<<endl; exit(3); } else { if(pid_tmp == 0){ pids[i] = pid_tmp; } else { child = 1; } } } } } if(child == 1){ //Child code }Gruß
Waldemar
-
ich probier das mal gleich. Da hätte ich aber noch eine Frage wegen formatieren von dem quellcode.
du schreibst das ja so:if(i==n){ i=0; }ich finde es aber übersichtlicher wenn man es so schreibt:
if(i==n) { i=0; }Aber das machen viele so wie du es machst, warum denn? Findest du deinen code übersichtlicher?
-
Hallo neoexpert,
also ich mach das so, weil wenn man editoren verwendet, die Teile des codes verbergen können dann folgende zeilen produzieren und das finde ich unpraktisch:
if(i==5) { _____________________________________Mir persönlich gefällt
if(i==5){ _____________________________________Besser.
Grüße
Waldemar
-
waldemar81 schrieb:
Hallo neoexpert,
also ich mach das so, weil wenn man editoren verwendet, die Teile des codes verbergen können dann folgende zeilen produzieren und das finde ich unpraktisch:
if(i==5) { _____________________________________Mir persönlich gefällt
if(i==5){ _____________________________________Besser.
Grüße
WaldemarKommt auf den Editor an.
Neoexpert, er wird schon die Notation verwenden die er übersichtlicher findet.
Diese beiden Notationen nehmen sich nichts, ist reine Gewohnheitssache, daher findest du diese beiden auch so häufig.
-
Hä?? schrieb:
Wenn du eh nur zählst erhöhe die Variable doch einfach im Vater.
P.S. es gibt nicht nur eine wait()-Funktion.
Ja, ich wolte aber tatsächliche anzahl der aktuell laufenden, kindprozesse.
-
Noch zwei Fragen hätte ich noch
1: wie realisiere ich threads unter linux? (Unter windows gehts ja mit CreateThread() ganz leicht)
2: Kann man in windows auch irgendwie den aktuellen Prozess kopieren? Oder gehts da genau so wie bei linux mit fork()?
-
Hallo,
neoexpert schrieb:
Noch zwei Fragen hätte ich noch
1: wie realisiere ich threads unter linux? (Unter windows gehts ja mit CreateThread() ganz leicht)
2: Kann man in windows auch irgendwie den aktuellen Prozess kopieren? Oder gehts da genau so wie bei linux mit fork()?1. siehe z.B. http://linux.die.net/man/3/pthread_create
2. Nein, die Prozessmodelle unterscheiden sich hier deutlich, man könnte dann mit CreateProcess, CreateThread und eventuell nötigen Interprozesskommunikations-Mitteln die fork-Funktionalität erreichen.MfG,
Probe-Nutzer