gpt4 book ai didi

C编程: Protected memory across fork()

转载 作者:行者123 更新时间:2023-11-30 15:57:57 26 4
gpt4 key购买 nike

我需要保护父级页面免受子级页面的影响

  • 我尝试过不在 mmap 中使用带有 MAP_ANONYMOUS 标志且 fd = -1 的 shm_open。
  • 我尝试过使用 fchmod 保护底层内存。

我目前正在使用以下设置:

shm_unlink("/mymem");
int fd = shm_open("/mymem", O_RDWR | O_CREAT,0777);

printf("FD is :%d\n", fd);
ftruncate(fd, numberPages*getpagesize());

int *z = mmap(NULL, getpagesize()*numberPages, PROT_WRITE|PROT_READ, MAP_SHARED,fd,0);
printf("Memory is at : %p\n", z);

if(fork()){
printf("Protecting %d\n",mprotect(z, getpagesize(), PROT_NONE));
printf("(1)No issues, apparently\n");

sleep(2);
exit(1);
}else{
sleep(1);
*z = 3;
printf("(2)No issues, apparently\n");
sleep(5);
printf("Value of z: %d\n",*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() changes protection for the calling process's memory page(s)

(强调)

您的问题归结为如何更改另一个进程(而不是调用进程)的内存映射的权限。如果没有目标进程(要更改内存映射的进程)的参与,我认为没有任何可移植的方法可以做到这一点。我能想到的唯一方法是作为调试器附加到目标进程(例如,请参阅 Linux 上的 ptrace() )。这是一个复杂的解决方案。您是否考虑过向父进程发送消息(例如通过管道)以要求其自行运行 mprotect()

关于C编程: Protected memory across fork(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10146592/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com