我想使用程序使用c在另一个程序中读取具有给定地址的变量。这是我的代码:
#include<stdio.h>
#include<stdlib.h>
volatile unsigned int *a;
int main(){
scanf("%d",&a);//input the pointer to the variable I want to read
while(1){
printf("%d\n",*a);
system("pause");
}
}
为了测试这个程序,我用另一个程序来改变变量。这是代码。
#include<stdio.h>
volatile unsigned int a;
int main(){
printf("%d\n",&a);//output the pointer to the variable
while(1)scanf("%d",&a);
}
我首先运行第二个程序,然后在第一个程序中输入变量的输出。每当我运行第二个程序时,我都会得到相同的输出。当我运行第一个程序时,每次都得到相同的值,尽管我在第二个程序中更改了变量。为什么不起作用?我的电脑是32位。
答案 0 :(得分:5)
具体是operating system,你通常应该避免这样做 - 即使可能 - 。首选其他inter-process communication设施(例如管道,插座,message passing)
在大多数操作系统上,每个process在address space中都有拥有 virtual memory,因此进程A无法更改进程B中的任何数据.BTW,两个进程可以同时运行(在不同的核心上)或准同时运行(由内核调度其任务),因此无需任何变量共享也没有任何意义。
某些操作系统提供shared memory设施,但您应该关注synchronization(例如semaphores)。
对于Linux,请阅读Advanced Linux Programming和shm_overview(7)&amp; sem_overview(7)
通常,您需要设计和调整两个程序以使它们进行通信。出于security原因,您不希望(并且您的操作系统kernel禁止)任意进程能够浏览其他进程的地址空间。
例如,您不希望您的游戏软件在未经您同意的情况下能够在您的浏览器中访问您的银行数据。
或者,将两个程序合并为一个multi-threaded应用程序。你会担心同步,可能需要使用mutexes。阅读例如一些POSIX threads tutorial。
另见MPI。顺便说一句,您可以使用一些database来分享公共数据(查看PostGreSQL,MongoDB等等)或调整client-server model