我尝试使用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的更改)
答案 0 :(得分:5)
C语言描述了一个程序的行为。您似乎有多个不同的程序。除了明确地通过I / O系统(FILE*
)或系统接口之外,不同的程序不会彼此交互,而是以平台相关的方式(例如,System-V上的共享内存)。
答案 1 :(得分:1)
全局变量的范围仅限于单个应用程序/可执行文件。
答案 2 :(得分:0)
这不是计算机的工作原理。
由于您展示了两个不同的main
函数,我将假设prog1
和prog2
是两个单独编译的可执行文件。
在所有现代操作系统中,禁止程序访问自己指定空间之外的内存。这由操作系统决定,并由CPU上的任意数量的功能强制执行。
通常,每个进程都在其自己的虚拟地址空间中运行。这意味着我无法编写直接修改notepad.exe
内存的程序。这是一个关键功能,可以使系统像现在一样稳定。
如果要在不同的正在运行的程序之间共享信息,或者甚至是同一程序的两个实例(这些都是单独的进程),那么您需要实现某种类型的Inter-Process Communication (IPC)
答案 3 :(得分:0)
我在prog1或prog2的任何地方都没有看到你调用工具的地方&#39; init
方法..所以它在prog2中打印0的事实可能就是编译器初始化它的原因。
此外,如果您将这些程序编译为两个单独的程序,它将永远不会执行您想要的操作。为此,您需要查看共享内存&#34;或&#34; IPC&#34;系统,允许两个同时运行的程序在运行时共享数据。