我需要保护父级中的页面免受子级页面的影响
- 我尝试不使用带有 MAP_ANONYMOUS 标志的 shm_open,并且在 mmap 中 fd = -1。
- 我尝试使用 fchmod 保护底层内存。
我目前正在使用以下设置:
shm_unlink("/mymem");
int fd = shm_open("/mymem", O_RDWR | O_CREAT,0777);
printf("FD is :%dn", fd);
ftruncate(fd, numberPages*getpagesize());
int *z = mmap(NULL, getpagesize()*numberPages, PROT_WRITE|PROT_READ, MAP_SHARED,fd,0);
printf("Memory is at : %pn", z);
if(fork()){
printf("Protecting %dn",mprotect(z, getpagesize(), PROT_NONE));
printf("(1)No issues, apparentlyn");
sleep(2);
exit(1);
}else{
sleep(1);
*z = 3;
printf("(2)No issues, apparentlyn");
sleep(5);
printf("Value of z: %dn",*z);
}
我需要子进程能够保护页面(使用 mprotect 或其他方式),以便父进程无法再读取/写入页面。
接收的输出为:
FD is :3
Memory is at : 0xf581a000
Protecting 0
(1)No issues, apparently
(2)No issues, apparently
Value of z: 3
当我期望(或者更确切地说,想要)在 *z = 3 行发生分段错误时。
不幸的是,孩子必须具有此功能,因为它也充当TCP服务器,并且将通过TCP连接接收阻止页面的请求(除非有我没有想到的另一种方法?
有什么建议吗?
子流程中的mrotect()
当然是更改子流程本身(而不是父流程)中页面的权限。这是记录的:
mprotect() 更改对调用进程内存页的保护
(着重号后加)
您的问题归结为如何更改另一个进程(而不是调用进程)的内存映射的权限。如果没有目标进程(要更改其内存映射的进程)的参与,我认为没有任何可移植的方法可以做到这一点。我能想到的唯一方法是作为调试器附加到目标进程(例如,请参阅 Linux 上的ptrace()
)。这是一个复杂的解决方案。您是否考虑过向父进程发送消息(例如,通过管道)以要求它自行运行mprotect()
?