我有3段代码:main.c、main2.c和sharedlib.c

Main.c:

#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <unistd.h>
#include <string.h>

extern char* sharedPtr;

int main(void)
{
    sharedPtr = mmap(NULL, 1024, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, 0);

    fprintf(stdout, "addr = 0x%x\n", sharedPtr);

    sleep(10);

    munmap(sharedPtr, 1024);

    return 0;
}

Main2.c:

#include <stdio.h>

extern char* sharedPtr;

int main(void)
{
    fprintf(stdout, "0x%x\n", (void*)sharedPtr);
    return 0;
}

sharedlib. c(只包含一个指针,没有其他内容):

char* sharedPtr;

当我启动Main时,它会打印出来,然后Hibernate 10秒:

addr = 0xb6f77000

在这10秒内,我启动了main2,但得到以下输出:

0x0

为什么?Main.c仍然在运行,所以它应该已经在共享库中设置了变量,但是它没有.为什么main2看不到指针的值?

我是如何编译的:

gcc main.c -o main -L${PWD} -lsharedlib
gcc main2.c -o main2 -L${PWD} -lsharedlib 
gcc sharedlib.c -o libsharedlib.so -shared -fPIC

EDIT:将该指针替换为随机整数,您将得到完全相同的结果,即main2看不到值main写入其中.Main2只打印0.换句话说,它与mmap的使用无关.

推荐答案

共享内存不会以这种方式工作.当您调用mmap()时,memory that mmap()'s returned pointer is pointing to是共享内存区的一部分,而不是指针本身;也就是说,指针变量sharedPtr仍然在调用进程的(私有/非共享)进程空间中,对sharedPtr变量本身的访问不受mmap()的影响.

如果希望在两个进程之间共享值,则需要在每个进程中调用mmap()(或者最好是shmget()shmat()),并将该值放入共享内存区本身(例如,memcpy(sharedPtr, &myValue, sizeof(myValue))或类似的值会将存储在myValue中的值复制到共享内存区的第一个字节,在那里两个进程都可以"看到"它们).

顺便提一句,即使您已经这样做了,将pointers放入共享内存区通常也不是一件有用的事情,因为指向非共享内存中的对象的指针在拥有非共享内存的进程之外将不可用,甚至指向共享内存区内另一个位置的指针也可能无法工作,因为mmap()可能在进程A中返回与在进程B中返回的基指针不同的基指针.

C++相关问答推荐

如何用C(使用两个s补数算术的32位程序)计算

修改pGM使用指针填充2-D数组但不起作用

C:gcc返回多个错误定义,但msvc—不""'

与unions 的未定义行为

增加getaddrinfo返回的IP地址数量

如果包含路径不存在,我的编译器可以被配置为出错吗?(GCC、MSVC)

ARM64 ASIMD固有的加载uint8_t* 到uint16x8(x3)?

我无法让LLDB正确运行我的可执行文件

为什么net/if.h在ifaddrs.h之前?

Kdb:仅升级指定的列

为什么双精度d=flt_max+flt_max;在c语言中得到inf的结果

强制转换变量以在 struct 中蚕食

关于scanf()和空格的问题

Go和C中的数据 struct 对齐差异

从不兼容的指针类型返回&&警告,但我看不出原因

在吉陀罗中,_2_1_和CONCAT11是什么意思?

如何在C中定义指向函数的指针并将该指针赋给函数?

C中的空指针是什么(_N)?

try 判断长整数是否为素数

中位数和众数不正确