Anzeige:
Ergebnis 1 bis 7 von 7

Thema: fork

  1. #1
    Registrierter Benutzer
    Registriert seit
    27.07.2000
    Beiträge
    123

    fork

    hi,

    kleines verständnisproblem ...

    wieso funktioniert das beschreiben des speichers des elternprozesses nicht?

    Code:
    #include <sys/types.h>
    #include <sys/times.h>
    #include <sys/wait.h>
    #include <sys/resource.h>
    #include <unistd.h>
    #include <stdio.h>
    #include <ctype.h>
    #include <stdlib.h>
    #include <time.h>
    
    int main(){
    
        int *pp, p, rc;
    
        p=10;
        pp = & p;
    
        printf("%d \t %p \n",p,pp);
    
        rc = fork();
    
        if(rc==0){
            *pp=2;
            printf("Child ");
        } else {
            sleep(10);
        }
    
        printf("%d \t %p \n",p,pp);
    
        return 0;
    }

  2. #2
    Registrierter Benutzer
    Registriert seit
    05.09.2002
    Ort
    Neuhausen
    Beiträge
    320

  3. #3
    Registrierter Benutzer
    Registriert seit
    24.09.2005
    Beiträge
    66
    fork ist ja gerade dazu da 2 unabhängige Prozesse zu erzeugen. Im Gegensatz zum Multithreading garantiert es dir, dass sich 2 Prozesse ihren Speicherbereich nicht teilen müssen.

  4. #4
    Registrierter Benutzer
    Registriert seit
    27.07.2000
    Beiträge
    123
    nun gut, erst mal danke für den Link, den kannte ich noch nicht ...

    fork "kopiert" doch den Elternprozess und fährt mit dem code an der gleichen Stelle fort wie der Elternprozess.?

    gut die Variablen die werden als Kopie und somit eigenständig im kindprozess geführt. ein Pointer ist aber doch nur eine Adresse. Die Ausgabe dieses Code-Schnipsels deutet doch darauf hin, dass der Pointer pp bei beiden Prozessen auf den gleichen Speicherbereich zeigt, oder?


    Ausgabe:

    10 0xbf90e9b8
    Child 2 0xbf90e9b8
    10 0xbf90e9b8


    Grüsse

    Reinhard

  5. #5
    Registrierter Benutzer
    Registriert seit
    24.09.2005
    Beiträge
    66
    Nur weil 2 Pointer in 2 Prozessen den gleichen Wert haben bedeutet das nicht dass sie auf die gleiche physikalische Addresse zeigen.
    Grundsätzlich wird bei modernen Betriebssystemen zwischen virtuellem und physikalischem Adressraum unterschieden. Mittels der Memory Managment Unit kann der Kernel physikalischen (echten) Speicher in den virtuellen Addressraum einblenden. Genau so können aber auch z.B. Dateien eingeblendet werden, wie es baim Aufruf von mmap() passiert.
    Dieser virtuelle Adressraum kann für jeden Prozess umkonfiguriert werden. Beim Fork wird auf diese Weise der Prozess 1:1 kopiert, die (virtuellen) Adressen zeigen dann einfach auf andere Speicherbereiche.

  6. #6
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549
    Wenn du wirklich shared memory zwischen zwei Prozessen willst, dann kannst du das afair mit shmget() einrichten. Aber da musst du dann auch mit Semaphoren und so arbeiten um die üblichen Zugriffskonflikte zu verhindern.

    MfG Peschmä
    The greatest trick the Devil ever pulled was convincing the world he didn't exist. -- The Usual Suspects (1995)
    Hey, I feel their pain. It's irritating as hell when people act like they have rights. The great old one (2006)

  7. #7
    Registrierter Benutzer
    Registriert seit
    27.07.2000
    Beiträge
    123
    Zitat Zitat von Yonibear Beitrag anzeigen
    Nur weil 2 Pointer in 2 Prozessen den gleichen Wert haben bedeutet das nicht dass sie auf die gleiche physikalische Addresse zeigen.
    Grundsätzlich wird bei modernen Betriebssystemen zwischen virtuellem und physikalischem Adressraum unterschieden. Mittels der Memory Managment Unit kann der Kernel physikalischen (echten) Speicher in den virtuellen Addressraum einblenden. Genau so können aber auch z.B. Dateien eingeblendet werden, wie es baim Aufruf von mmap() passiert.
    Dieser virtuelle Adressraum kann für jeden Prozess umkonfiguriert werden. Beim Fork wird auf diese Weise der Prozess 1:1 kopiert, die (virtuellen) Adressen zeigen dann einfach auf andere Speicherbereiche.
    danke .... jetzt bin ich ein ganzes stück schlauer geworden. das ganze muss ich mir mal noch genauer anschauen.

    ***** - Antwort

    und natürlich auch danke für die ergänzende Information an peschmae

    Grüsse
    Reinhard

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •