c - 有没有办法在运行 Linux 或 Windows 的台式计算机上使用 C 中的 "test"关键字来实现 "volatile"?

标签 c linux memory memory-management volatile

我知道 C 中的“volatile”关键字用于告诉编译器不要将变量从 RAM 内存加载到寄存器或高速缓存中,并且始终从计算机工作内存中读取变量。

但是我也读到用例是当另一个设备正在修改存储在变量中的内存地址处的值时。

我的问题是:

当程序在 Linux 或 Windows 机器上运行时,是否有可能修改内存地址的值,这些机器也有 MMU 并为其程序使用虚拟地址空间(如所有现代机器)?

是否可以从另一个程序更改一个程序的变量(在不同的进程中运行,而不仅仅是不同的线程)?

最佳答案

Is there any possibility to modify the value of a memory address while a program is running on a Linux or a Windows machine that also has a MMU and uses virtual address space for its programs (like all modern machines)?

当然可以!

最明显的例子是线程:另一个线程可能正在更新您正在查看的内存,所以您不想假设它永远不会改变。

其他示例包括:

  • 共享内存。进程可以同意共享一 block 内存以实现高效的 IPC。
  • mmap。程序可以将文件映射到内存中。当文件发生变化时,相应的内存也会发生变化(在Linux上,这是共享内存的基础)。
  • DMA。可以要求其他设备(如硬盘驱动器)将数据直接写入 RAM 以实现高效传输。

Is it possible to change a variable of a program from another program (running in a different process not only a different thread) ?

是的。如果进程同意,您可以使用共享内存。

如果他们不这样做,一个可以将自己附加到另一个作为调试器并检查/修改其内存。

关于c - 有没有办法在运行 Linux 或 Windows 的台式计算机上使用 C 中的 "test"关键字来实现 "volatile"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46695958/

相关文章:

c - malloc 和 free 的计时

c - 为什么用 getchar 读取并打印整个字符串?

linux - 获取从当前目录到作为参数给出的文件夹的相对路径

linux - 如何在 Linux 上启用 WiFi channel 12 和 13?

c++ - program.exe : 0xC0000005: Access violation reading location 0xCCCCCCD0 中 0x010F2F1C 处未处理的异常

c++ - 部分和 OpenMP 代码有时会挂起

C 线程 Http 服务器错误

linux - 希望在 linux 中获得等同于 ms-dos 的超时/等待命令

c - 结构中的字节顺序

linux - Linux 上响应 free 命令的可用内存和可用内存是什么?