2013-06-14 2 views
3

Если процесс и его вилка имеют разные копии данных, то почему их указатель одинаковый?Форки и общая память

В приведенном ниже примере, если счет был разделен между родительским и дочерним процессами, мы увидели бы count: 2. Однако счет не используется. Но тогда почему &count возвращает одно и то же значение как в родительском, так и в дочернем процессах?

Выход:

count: 1 0x7fff5a617510 
count: 1 0x7fff5a617510 

Программа:

#include <stdio.h> 
#include <pthread.h> 
#include <sys/types.h> 
#include <unistd.h> 

int main() { 
    pid_t pid; 
    int count = 0; 

    pid = fork(); 

    count++; 
    printf("count: %d %p \n", count, &count); 

    return 0; 
} 
+5

Это виртуальная адресация. Адрес, который видит ваш процесс, напрямую не соответствует физическим адресам. –

+1

Есть ли способ увидеть физический адрес? – luqmaan

+0

Хм. Вывод для меня: 'error: 'new_count' undeclared (сначала использовать в этой функции)'. :) – pilcrow

ответ

3

Как было отмечено в комментариях, это из-за виртуальной адресации. AFAIK нет способа увидеть физический адрес, так как это обрабатывается ядром и MMU.

Кроме того, обратите внимание, что даже если счет был разделен между двумя процессами (с использованием общей памяти, например, man shmget), было бы условие гонки.

Смежные вопросы