C编程:fork()上受保护的内存

时间:2012-04-13 18:47:26

标签: c fork mmap mprotect

我需要保护父母中的页面不受孩子页面

的影响
  • 我尝试过不使用带有MAP_ANONYMOUS标志的shm_open和mmap中的fd = -1。
  • 我尝试用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连接接收阻止页面的请求(除非我还没有想到的另一种方法?)。

任何建议?

1 个答案:

答案 0 :(得分:1)

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

  

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

(强调补充)

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