我有一个带值的变量,我想与proccesses分享。
例如:
typedef struct {
unsigned int a;
unsigned int b;
another_struct * c;
} struct1;
...
struct1 A ={...};
...
现在,我想创建一个共享内存区域并将A变量放在此区域中。我怎么能这样做?
答案 0 :(得分:1)
共享内存是operating system功能(C11中不存在)。它不是"提供"按C标准。
我猜你正在编写Linux代码。顺便说一句,请阅读Advanced Linux Programming。
先阅读shm_overview(7)。您需要同步,因此请阅读sem_overview(7)。
您将一些共享内存段添加到指针中,并且您将使用该指针。
首先,使用shm_open(3)打开共享内存段:
int shfd = shm_open("/somesharedmemname", O_RDWR|O_CREAT, 0750);
if (shfd<0) { perror("shm_open"); exit(EXIT_FAILURE); };
然后在shfd
上使用mmap(2):
void* ad = mmap(NULL, sizeof(struct1), PROT_READ|PROT_WRITE, MAP_SHARED,
shfd, (off_t)0);
if (ad==MMAP_FAILED) { perror("mmap"); exit(EXIT_FAILURE); };
然后你可以将该地址转换为指针:
struct1* ptr = (struct1*)ad;
并使用它。 (别忘了close
)。
ptr->a = 23;
当然,不要期望将相同的共享段映射到同一地址(这样您就可以轻松处理指针字段,如c
)在不同的过程中。您可能应该避免共享struct
- s中的指针字段。
请注意,C变量仅在编译时存在。在运行时,您只有位置和指针。
PS。共享内存是一个非常困难的inter-process communication机制。您可能更喜欢pipe(7) - s或fifo(7) - s,并且您需要使用poll(2)进行多路复用。
答案 1 :(得分:1)
我基本上将整个分片内存段视为void*
,您可以将项目放在。string.h
。您可以使用A
的{{3}}将A复制到共享内存空间。但是,如果您尝试在连接到共享内存段的另一个进程中使用它,则_posts
中的指针将变为无效并导致段错误。