共享内存内指针使用问题,求关注!!!谢谢~~
各位同学,请教个问题:
我现在预想实现一个有动态增加机制的共享内存,一来可以应予系统吞吐量(量大的时候增加记录节点,量小的时候释放记录节点),二者则可以合理控制内存的使用上限。
预计的实现流程是:
1、创建共享内存,定义节点结构,结构如下:
struct namedShareM {
sem_t mutex, nempty, nstored;//多进程同步访问信号量
struct stringNode * headNode;//头结点
struct stringNode * currNode;//当前处理节点
};
//节点结构
struct stringNode {
char charStr[ 100 ];
struct stringNode * next;
};
2、初始化共享内存,封装put方法,负责将值放入共享内存,此方法由A进程调用,方法中会malloc一块节点,用初始化好的共享内存两个指示指针指向这块空间。
3、封装get方法,负责从共享内存中取A进程放入的值,此方法由B进程调用,方法中会用共享内存头结点指针取得处理节点,问题就出现在这里,下面上截图:
A进程put地址:
(gdb) print reqSharePtr->headNode
$1 = (stringNode *) 0x6050d0
(gdb) print &reqSharePtr->headNode->charStr[0]
$3 = 0x6050d0 "hello"
(gdb) x/16xw 0x6050d0
0x6050d0: 0x6c6c6568 0x0000006f
但是B进程的地址空间:
(gdb) print reqSharePtr->headNode
$1 = (stringNode *) 0x6050d0
(gdb) print &reqSharePtr->headNode->charStr[0]
$2 = 0x6050d0 "@!u\367\377\177"
(gdb) x/16xw 0x6050d0
0x6050d0 <_GLOBAL_OFFSET_TABLE_+232>: 0xf7752140 0x00007fff
从运行的结果可以看出
1、共享内存确实保存了malloc后的地址值;
2、是否可以证明B进程的地址空间不同于A进程的地址空间,因为同一个地址值确实不一样的数据?
那该怎样实现动态共享内存呢?
谢谢大家的帮忙,感激!!!
我现在预想实现一个有动态增加机制的共享内存,一来可以应予系统吞吐量(量大的时候增加记录节点,量小的时候释放记录节点),二者则可以合理控制内存的使用上限。
预计的实现流程是:
1、创建共享内存,定义节点结构,结构如下:
struct namedShareM {
sem_t mutex, nempty, nstored;//多进程同步访问信号量
struct stringNode * headNode;//头结点
struct stringNode * currNode;//当前处理节点
};
//节点结构
struct stringNode {
char charStr[ 100 ];
struct stringNode * next;
};
2、初始化共享内存,封装put方法,负责将值放入共享内存,此方法由A进程调用,方法中会malloc一块节点,用初始化好的共享内存两个指示指针指向这块空间。
3、封装get方法,负责从共享内存中取A进程放入的值,此方法由B进程调用,方法中会用共享内存头结点指针取得处理节点,问题就出现在这里,下面上截图:
A进程put地址:
(gdb) print reqSharePtr->headNode
$1 = (stringNode *) 0x6050d0
(gdb) print &reqSharePtr->headNode->charStr[0]
$3 = 0x6050d0 "hello"
(gdb) x/16xw 0x6050d0
0x6050d0: 0x6c6c6568 0x0000006f
但是B进程的地址空间:
(gdb) print reqSharePtr->headNode
$1 = (stringNode *) 0x6050d0
(gdb) print &reqSharePtr->headNode->charStr[0]
$2 = 0x6050d0 "@!u\367\377\177"
(gdb) x/16xw 0x6050d0
0x6050d0 <_GLOBAL_OFFSET_TABLE_+232>: 0xf7752140 0x00007fff
从运行的结果可以看出
1、共享内存确实保存了malloc后的地址值;
2、是否可以证明B进程的地址空间不同于A进程的地址空间,因为同一个地址值确实不一样的数据?
那该怎样实现动态共享内存呢?
谢谢大家的帮忙,感激!!!
...全文
相关推荐
c++ 操作共享内存代码
**写入**:将数据存入共享内存,使其他进程可以访问。这可能通过指针操作或类成员函数实现。3. **读取**:从共享内存中提取数据,供当前进程使用。4.
nginx中共享内存的使用详解
为了在这些进程间高效地进行数据共享和协同工作,Nginx利用了共享内存作为进程间的通信手段。本文
共享内存封装类示范代码
在实际应用中,需要关注共享内存的创建、映射、读写以及同步等问题,确保程序的稳定性和正确性。
win32下进程间通信(共享内存)实例分析
在本文中,我们将重点关注使用Win32 API的共享内存方法进行进程间通信的实例分析。共享内存是一种高效的数据传递方式,因为它允许多个进程直接访问同一块内存区域,避免了数据复制的开销。
linux下C语言编程4-使用共享内存实现进程间通信.pdf
"该资源是关于Linux环境下使用C语言编程实现进程间通信的教程,重点关注的是通过共享内存机制进行通信的方法。文中介绍了四个关键的共享内存函数:shmget、shmat、shmdt和shmctl,并


