Страниците се получават (изтриват) при използване на shmget и shmat

Написах следните 2 тестови програми, една, която използва shmat и друга, която използва shmget и execve е първият двоичен файл.

Кодът е както следва: -

int main(int argc, char **argv) {
  void *retval;
  long shmid = atol(argv[1]);

  retval = shmat(shmid, NULL, SHM_RDONLY);
  printf("%p\n", retval);
}

И обвиващият файл,

int setupshm(char *name) {
  int shmid;
  shmid = shmget(IPC_PRIVATE, 100, IPC_CREAT|0666);
  return shmid;
}

int main() {

  int pid = fork();
  if (pid == 0) {
  char **envp = NULL;
  char *argv[3];
  char num[10];

  sprintf(num, "%d", setupshm("whatever"));

  argv[1] = "./test";
  argv[2] = num;
  argv[3] = NULL;

  execve("./test", argv, envp);
}

else { int status; wait(pid, &status, 0); }
}

Изпълнявам обвиващата програма в gdb, прихващам execve, отстранявам грешки в тестовата програма, виждам, че shmget успява; след това проверете неговите /proc/pid/maps и виждам, че страницата, съответстваща на shmget, се показва като „(Изтрито)“. Защо това се случва? какво правя грешно


person Community    schedule 01.03.2015    source източник
comment
Преместете setupshm() преди разклонението. В текущата версия. вие създавате shm в детето, след което презаписвате детето с нов процес. Ето защо паметта е маркирана за изтриване.   -  person ott--    schedule 01.03.2015


Отговори (1)


Нищо не е наред; нищо не се изтрива. Нотацията (Deleted) е точно как Linux представя картографирането на файлове, които нямат наименована връзка във файловата система.

person R.. GitHub STOP HELPING ICE    schedule 01.03.2015
comment
Можете да получите допълнителна информация за SysV IPC обекти от командата ipcs, включително истинското състояние на маркирания за изтриване флаг (който се показва като dest в колоната status). Също така може да се заинтересувате от командата ipcrm, когато осъзнаете колко неизползвани shm сегменти сте оставили да лежат наоколо - person ; 01.03.2015