Probleme mit fork() [gelöst]



  • Ich sitze nun schon eine Ewigkeit an einem überaus seltsamen Verhalten eines kleinen Progrämmchens. Ich möchte zu Lernzwecken etwas mit fork() und minimalen Netzwerkfunktionen arbeiten. Ich hab mir einen kleinen Portscanner gebastelt, welcher einen bestimmten server auf einen bestimmten port scannen soll, wenn eine Verbindung hergestellt werden kann, soll die Verbindung sofort wieder geschlossen werden und ein Rückgabewert retourniert werden (-1 bei error, 1 bei keine Verbindung möglich und 0 bei Erfolg). Da ich wie gesagt etwas mit fork() spielen möchte, hab ich den Prozess des portscans vom hauptprozess separiert. Der Funktion übergebe ich nebst den Angaben über den zu scannenden Port einen Zeiger auf eine Integer Variable, einen Funktionszeiger für eine callback Funktion (welche nach dem Scan aufgerufen werden soll) und die Prozess id des Hauptprozesses, welcher als Parameter für die callback Funktion genutzt werden soll.
    Das Problem dabei ist, dass ich nie den korrekten Rückgabewert der scanfunktion erhalte. Die Integervariable, welche ich der Funktion als Zeiger übergebe, wird partout nicht geändert. Dabei sollte doch die Adresse einer Integer Variablen im Haupt- und im Kindsprozess doch dieselbe sein!?
    Welchen Denkfehler mache ich?

    pid_t pid_pdo, pid_main;
    pid_main = getpid();
    int result = 2;
    switch( pid_pdo = fork() )
    {
    case -1:
      printf("Error in fork(): %s\n", strerror( errno ) );
      exit( EXIT_FAILURE );
    case 0: /* Kind */
      pscan( &scandat, &result, &send_alarm, pid_main );
      exit( EXIT_SUCCESS ),
    default: /* Hauptprozess */
      break;
    }
    if( 2 == result )
    {
      alarm( TIMEOUT_ );
      if( 0 != sigwait( &sigset, &sig ) )
        {
          printf("Error in sigwait: %s\n", strerror( errno ) );
          exit( EXIT_FAILURE );
        }
    }
    printf("Result: %d\n", result );
    exit( EXIT_SUCCESS );
    

    Gibt bei mir stets den Wert 2 zurück, obwohl ich in der Funktion pscan den Wert mit

    *res = 0;
    

    setze....
    Vielen Dank für jeden Hinweis!!!



  • Die Funktion pscan läuft im Kind. Der kann die Daten des Vaterprozesses nicht ändern. Auch nicht, wenn Du einen Zeiger darauf hast. Er hat seine eigene Instanz von result. Wenn Du wirklich im Vaterprozess Verarbeitungsergebnisse des Kindprozesses verarbeiten willst, kommst Du um irgendwelche Interprzesskommunikationsmechanismen (was für ein schönes Wort 😃 ) nicht vobei. Im Falle einer Vater-Kind-Beziehung bietet sich eine pipe an.



  • Vielen Dank! Wusste ich nicht, das verwirrt mich auch, da es doch heisst, dass sich Vater- und Kindsprozess denselben Adressraum teilen...
    hmm, werde mich betreffend pipes mal schlau machen!
    Danke!



  • Super! Vielen Dank nochmals tntnet!!! Mit einer pipe funktionierts prächtig!
    Wieder mal was dazugelernt! Ich finde einfach, das hätte in meinem Buch etwas genauer stehen dürfen!...
    Naja, zum Glück gibts solche Foren! 😃
    Grüsse


Anmelden zum Antworten