Hilfe bei waitpid (Anfänger)



  • Hallo,
    ich muss hier ein programm schreiben dass 2 Kindprozesse erzeugt die jeweils zufällig eine Zahlenfolge zw. 0 und 100 ermitteln. Beim ersten mal wo die Zahl 100 auftritt, beendet sich der jeweilige Prozess.
    Ermittle mit den Fkt. wait und waitpid den Prozess, der sich zuerst beendet und die Dauer, wie lange beide Prozesse laufen.

    Okay... ansich nich so schwer.

    Meine Frage is ob ich dass mit dem waitpid soweit richtig hab und ob mir vll. einer sagen könnte was hier sonst noch falsch sein könnte 😞 .

    Hier mal mein bisheriger Code:

    #include <stdio.h>
    #include <sys/types.h>
    #include <sys/wait.h>
    
    int main(void) {
    int cfork1;
    int cfork2;
    int wert1;
    int wert2;
    int i=0;
    int j=0;
    
    	cfork1=fork();
    
    	if (cfork1==0) {
    		// Kindprozess 1
    		srand(time(0)%100);
    		do {
    			wert1=rand()%101;
    		} while (wert1!=100);
    		exit(0);
    	} else if (cfork1>0) {
    		// Elternprozess
    		do {		/* So lange Kindprozess existiert */
    			i++;
    		} while (waitpid(cfork1, NULL, WNOHANG)==0);
    
    		cfork2=fork();
    		if (cfork2==0) {
    			// Kindprozess 2
    			srand(time(0)+350000);
    			do {
    				wert2=rand()%101;
    			} while (wert2!=100);
    			exit(0);
    		} else if (cfork2 > 0)	{
    			// Elternprozess
    			do {
    				j++;
    			}
    			while (waitpid(cfork2,NULL,WNOHANG)==0);
    		}
    	}
    
    	if (i>j)
    		printf("\n\n\nDer 2. Prozess hat schneller den Wert 100 erreicht!\n\n\n");
    	else if (i==j) {
    		printf("\n\n\nUnentschieden!\n\n\n");
    	} else
    		printf("\n\n\nDer 1. Prozess hat schneller den Wert 100 erreicht!\n\n\n");
    }
    


  • also du hast da einen ganz großen logischen fehler im programm.
    du wartest ja nach dem ersten fork mit waitpid bis der erste child prozess beendet, dann erst erzeugst du den zweiten. außerdem sehe ich nicht den sinn eine variable in der do..while schleife hochzuzählen, weil du ja über die geschwindigkeit keine aussagen machen kannst. dein vergleich i>j ist also völlig ohne aussagekraft. stattdessen solltest du zuerst beide prozesse erzeugen, und danach (!!!) mit waitpid(-1, NULL, 0) warten bis einer der beiden (das argument -1 wartet auf beliebigne prozess).

    dann vergleichst du den rückgabewert von waitpid mit den pid's der beiden erzeugten prozesse, wenn gleich hast du den der zuerst beendet hat. eine schleife um waitpid ist so nicht nötig, da es mit meinen parametern blockt.

    Hoffe ich konnte helfen. sonst melde dich nochmal mit deinem veränderten code.



  • Jawoi, thx! Hab nur noch'n paar Zeilen Code hinzufügen müssen dann is endlich gegangen!

    Danke für deine Hilfe, hab wie gesagt das waitpid verändert, den 2. fork aufruf nach vorne im elternprozess und dann die rückgabewerte von beiden forks mit dem rückgabewert vom waitpid verglichen! Roxx0r, thx


Anmelden zum Antworten