[C] fork i kopiowanie zawartości pamięci

Bash, C, C++, Java, PHP, Ruby, GTK, Qt i wiele innych - wszystko tutaj.
Awatar użytkownika
dawwin
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 202
Rejestracja: 18 kwie 2009, 09:16
Płeć: Mężczyzna
Wersja Ubuntu: 11.04
Środowisko graficzne: GNOME
Architektura: x86
Kontakt:

[C] fork i kopiowanie zawartości pamięci

Post autor: dawwin »

Mam pytanie odnośnie kopiowania zawartości pamięci należącej do procesu podczas wywoływania funkcji fork().
Poniżej jest przykładowy kod, w którym ręcznie alokuję sobie pamięć, następnie ustawiam wartość dla a na 1, rozdzielam procesy, w potomku ustawiam a na 5 i drukuję, po sekundzie robię to samo u przodka.
Może mi ktoś wytłumaczyć, dlaczego pomimo takiego samego adresu w pamięci wartości dla a u przodka i potomka są różne?

Kod:

Kod: Zaznacz cały

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main()
{
    char *a;
    a = (char *) malloc(sizeof(char));
    *a = 1;

    if (fork() == 0) {
        *a = 5;
        printf("%d %p %d\n", *a, a, getpid());
    } else {
        sleep(1);
        printf("%d %p %d\n", *a, a, getpid());
    }

    return 0;
}
Wyniki:

Kod: Zaznacz cały

5 0x82b9008 6860
1 0x82b9008 6859
Awatar użytkownika
DDAroo
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 107
Rejestracja: 27 cze 2009, 10:47
Płeć: Mężczyzna
Wersja Ubuntu: 11.04
Środowisko graficzne: KDE Plasma
Architektura: x86
Lokalizacja: Kraków
Kontakt:

Odp: [C] fork i kopiowanie zawartości pamięci

Post autor: DDAroo »

http://www.digipedia.pl/man/doc/view/fork.2/ - osobny proces, osobna pamięć wirtualna; pamiętaj też, że w systemie linux każdy proces ma niezależną pamięć wirtualną - każdy proces "widzi", że ma 3GB pamięci do wyłącznej dyspozycji nawet, jeśli masz fizycznie 512MB ram-u w komputerze.
Awatar użytkownika
el.pescado
Zakręcona Traszka
Zakręcona Traszka
Posty: 734
Rejestracja: 26 maja 2005, 11:43
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: GNOME
Architektura: x86
Kontakt:

Odp: [C] fork i kopiowanie zawartości pamięci

Post autor: el.pescado »

fork() kopiuje proces. Każdy proces ma własną przestrzeń adresową. Jeżeli chcesz inaczej, możesz użyć:
* pamięci współdzielonej
* wątków zamiast procesów
Awatar użytkownika
dawwin
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 202
Rejestracja: 18 kwie 2009, 09:16
Płeć: Mężczyzna
Wersja Ubuntu: 11.04
Środowisko graficzne: GNOME
Architektura: x86
Kontakt:

Odp: [C] fork i kopiowanie zawartości pamięci

Post autor: dawwin »

Nie chcę inaczej. Po prostu interesowało mnie, czy nie będzie jakichś konfliktów z tego powodu
ODPOWIEDZ

Wróć do „Programowanie”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 12 gości