Използването на extern в C не работи според очакванията

Създадох два файла:

настройваеми.h

#ifndef TUNABLES_H
#define TUNABLES_H

void tunables_load_conservative();
void tunables_load_aggressive();

extern int timer_x;
#endif /*TUNABLES_H */

и регулируеми.c

#include "tunables.h"

int timer_x;

void tunables_load_conservative(){
     timer_x = 3;
}
void tunables_load_aggressive(){
     timer_x = 1;
}

Всички други файлове на моя проект включват "tunables.h". Когато заредя проекта както A.c, така и B.c извиква tunables_load_conservative, но ако след известно време извикам във файл A.c tunables_load_aggressive() във файл B.c timer_x остава 3. Защо?

Това е моят Makefile:

INCLUDE=`pwd`/include
GCCFLAGS= -ansi -O3 -pedantic -Wall -Wunused -I${INCLUDE} -DDEBUG 
GCCOTHERFLAGS= -ggdb -pg

all: A B

A: A.o tunables.o
    gcc -o A ${GCCFLAGS} ${GCCOTHERFLAGS} tunables.o

B: B.o tunables.o
    gcc -o LBfixed ${GCCFLAGS} ${GCCOTHERFLAGS} tunables.o

A.o: A.c
    gcc -c ${GCCFLAGS} ${GCCOTHERFLAGS} A.c

B.o: B.c
    gcc -c ${GCCFLAGS} ${GCCOTHERFLAGS} B.c

tunables.o: tunables.c
    gcc -c ${GCCFLAGS} ${GCCOTHERFLAGS} tunables.c

clean:
    rm -rf *.o A B

person Federico    schedule 08.11.2009    source източник
comment
Моля, маркирайте правилно вашите въпроси, свързани с make (с етикет [make]). Повече информация: meta.stackexchange.com/questions/24030/   -  person P Shved    schedule 09.11.2009


Отговори (1)


Изглежда, че имате два отделни процеса, A и B. Декларацията extern не настройва споделена памет между процеси, но вместо това позволява на различни компилационни единици в рамките на един и същи процес да имат достъп до една и съща променлива.

За да споделите променлива между процеси, ще трябва да използвате зависими от системата IPC методи.

person Greg Hewgill    schedule 08.11.2009
comment
О, право си! -_- Не мога да го забележа, защото създадох шел скрипт, който изпълнява и двата процеса автоматично. :P - person Federico; 08.11.2009