c中不同源文件之间的共享变量

时间:2014-05-21 21:49:43

标签: c variables shared extern

我尝试使用extern在c中的不同源文件之间共享一个全局变量。 似乎每个程序都创建了本地不同的变量副本,因此,当程序更改其值时,第二个程序也无法看到更改。我可以修复此问题吗?该计划如下:

的Tools.h

#ifndef  __TOOLS__
#define  __TOOLS__
#include <errno.h>
#include <stdlib.h>

extern int i;

void init();

#endif 

tools.c

#include "tools.h"
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>

int i;

void init(){

i=0;
}  

prog1.c的

#include "tools.h"
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc,char *argv[]){

i=1;
printf("%d\n", i);

return 0;
}

prog2.c

#include "tools.h"
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc,char *argv[]){

sleep(1);
printf("%d\n", i);

return 0;
}

prog1打印1

prog2打印0(目标是打印1 - 请参阅值prog1的更改)

4 个答案:

答案 0 :(得分:5)

C语言描述了一个程序的行为。您似乎有多个不同的程序。除了明确地通过I / O系统(FILE*)或系统接口之外,不同的程序不会彼此交互,而是以平台相关的方式(例如,System-V上的共享内存)。

答案 1 :(得分:1)

全局变量的范围仅限于单个应用程序/可执行文件。

答案 2 :(得分:0)

这不是计算机的工作原理。

由于您展示了两个不同的main函数,我将假设prog1prog2是两个单独编译的可执行文件。

在所有现代操作系统中,禁止程序访问自己指定空间之外的内存。这由操作系统决定,并由CPU上的任意数量的功能强制执行。

通常,每个进程都在其自己的虚拟地址空间中运行。这意味着我无法编写直接修改notepad.exe内存的程序。这是一个关键功能,可以使系统像现在一样稳定。

如果要在不同的正在运行的程序之间共享信息,或者甚至是同一程序的两个实例(这些都是单独的进程),那么您需要实现某种类型的Inter-Process Communication (IPC)

答案 3 :(得分:0)

我在prog1或prog2的任何地方都没有看到你调用工具的地方&#39; init方法..所以它在prog2中打印0的事实可能就是编译器初始化它的原因。

此外,如果您将这些程序编译为两个单独的程序,它将永远不会执行您想要的操作。为此,您需要查看共享内存&#34;或&#34; IPC&#34;系统,允许两个同时运行的程序在运行时共享数据。