Использование extern в C не работает должным образом

Я создал два файла:

настройки.h

#ifndef TUNABLES_H
#define TUNABLES_H

void tunables_load_conservative();
void tunables_load_aggressive();

extern int timer_x;
#endif /*TUNABLES_H */

и настройки.с

#include "tunables.h"

int timer_x;

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

Все остальные файлы моего проекта включают "tunables.h". Когда я загружаю проект, Ac и Bc вызывают tunables_load_conservative, но если через некоторое время я вызываю в файле Ac tunables_load_aggressive() в файле Bc 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
Омг ваше право! -_- Я не могу этого заметить, потому что я создал сценарий оболочки, который запускает оба процесса в автоматическом режиме. :П - person Federico; 08.11.2009