PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : fork



pucki
03-12-2006, 11:28
hi,

kleines verständnisproblem ...

wieso funktioniert das beschreiben des speichers des elternprozesses nicht?



#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;
}

RapidMax
03-12-2006, 20:44
http://catb.org/esr/faqs/smart-questions.html

Gruss, Andy

Yonibear
03-12-2006, 21:08
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.

pucki
03-12-2006, 21:46
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

Yonibear
04-12-2006, 05:37
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.

peschmae
04-12-2006, 10:18
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ä

pucki
04-12-2006, 12:40
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