Написах следните 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, се показва като „(Изтрито)“. Защо това се случва? какво правя грешно
setupshm()
преди разклонението. В текущата версия. вие създавате shm в детето, след което презаписвате детето с нов процес. Ето защо паметта е маркирана за изтриване. - person ott--   schedule 01.03.2015