水木社区手机版
首页
|版面-C++程序设计语言(CPlusPlus)|
新版wap站已上线
返回
1/1
|
转到
主题:请教个共享内存文件描述符,子进程继承的问题。
楼主
|
saynothing
|
2022-04-01 13:51:15
|
只看此ID
AB两进程通信,其中A负责创建共享内存,B负责写。 A分析写入的内容。
问题:
B通过shm_open/shm_at操作,打开文件描述符,并映射共享内存到自己的进程地址空间。
如果B还fork出C、D、E进程,其中CDE进程都要往共享内存写(不考虑数据一致性的问题)。
这个时候C、D、E还能往共享内存写吗?
疑问:
1)CDE如果通过继承父进程B的shm_open/shm_at等共享内存写封装代码。 个人认为是做不到的。
原因:shm_open的时候,变成了A<-->B,A<-->C/D/E操作。 而不是AB两进程的通信模式。
2)如果C、D、E也要能往共享内存写。
那么CDE需要单独实现写封装代码。而CDE只能映射A创建出的共享内存ID,到自己的进程地址空间。 这种方式共享内存应该不支持,一个进程创建共享内存,多个进程写。 另外,违反原有的通信协议,最终不能work。
即便要支持,只能是继承父进程shm_open时的文件描述符,那么问题来了:是否要映射到子进程自己的地址空间。
说的比较绕
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
感觉要修改成同一份共享内存写封装代码,还是比较棘手的事情(这部分代码插桩实现,是插桩器的一部分)。
--
FROM 223.104.159.*
1楼
|
z16166
|
2022-04-01 17:17:38
|
只看此ID
这你可以自己写个带printf的POC小程序试一下不就知道了
--
FROM 114.241.228.*
2楼
|
Bernstein
|
2022-04-02 01:51:55
|
只看此ID
Windows上肯定可以做,不涉及权限问题的话(有些进程是有特权的),用shared section就可以实现,特别简单;涉及权限的话,需要用api来搞内存映射并设置权限;
Linux上用mmap应该也可以实现吧,但不太确定
【 在 saynothing 的大作中提到: 】
: AB两进程通信,其中A负责创建共享内存,B负责写。 A分析写入的内容。
: 问题:
: B通过shm_open/shm_at操作,打开文件描述符,并映射共享内存到自己的进程地址空间。
: ...................
--
FROM 123.112.17.*
3楼
|
brucewww
|
2022-04-03 09:51:50
|
只看此ID
可以用命名对象。跨进程直接用就行,都不用考虑fork的问题,注意创建着和使用者就行
【 在 saynothing 的大作中提到: 】
: AB两进程通信,其中A负责创建共享内存,B负责写。 A分析写入的内容。
: 问题:
: B通过shm_open/shm_at操作,打开文件描述符,并映射共享内存到自己的进程地址空间。
: ...................
--
FROM 118.247.81.*
4楼
|
saynothing
|
2022-04-03 11:29:30
|
只看此ID
嗯嗯。 定位到问题原因了。 如果子程序fork出来的,那么可以。 子进程继承父进程的文件描述符。
如果是exec,则不行。
问题在于插桩的代码,是exec()出来的。 PG子进程。
这个问题,walk around解决了。
【 在 z16166 的大作中提到: 】
: 这你可以自己写个带printf的POC小程序试一下不就知道了
--
修改:saynothing FROM 115.198.16.*
FROM 115.198.16.*
5楼
|
z16166
|
2022-04-03 12:55:02
|
只看此ID
good
【 在 saynothing 的大作中提到: 】
: 嗯嗯。 定位到问题原因了。 如果子程序fork出来的,那么可以。 子进程继承父进程的文件描述符。
: 如果是exec,则不行。
: 问题在于插桩的代码,是exec()出来的。 PG子进程。
: ...................
--
FROM 114.241.228.*
1/1
|
转到
选择讨论区
首页
|
分区
|
热推
BYR-Team
©
2010.
KBS Dev-Team
©
2011
登录完整版