【问题标题】:C Programming: Protected memory across fork()C 编程:跨 fork() 的受保护内存
【发布时间】:2012-04-26 03:47:07
【问题描述】:

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

  • 我尝试过在 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 连接接收阻止页面的请求(除非我没有想到其他方法?)。

有什么建议吗?

【问题讨论】:

    标签: c fork mmap mprotect


    【解决方案1】:

    您子进程中的mrotect() 当然是在子进程本身而不是在父进程中更改页面的权限。这是记录在案的:

    mprotect() 更改对调用进程的内存页的保护

    (强调)

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

    【讨论】:

    • 你已经完全解决了这个问题。我现在要查找 ptrace() 。不幸的是,父进程将不断执行其他操作,所以我不能让它在等待消息到达时阻塞>
    • 您可以在父进程中创建一个线程,在父进程的主线程继续工作时阻止等待来自子进程的消息。
    • 嗯——这个主意不错,我午饭后试试。
    • 使用单独的线程和管道命令解决了问题,谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-02
    • 1970-01-01
    • 2023-03-10
    • 2012-02-09
    • 2011-01-29
    • 2010-11-29
    • 2013-04-08
    相关资源
    最近更新 更多