【发布时间】:2015-03-01 01:38:36
【问题描述】:
我编写了以下 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中运行wrapper程序,拦截execve,调试测试程序,看到shmget成功;然后检查它的 /proc/pid/maps,我看到与 shmget 对应的页面显示为“(已删除)”。为什么会这样?我做错了什么?
【问题讨论】:
-
在分叉调用之前移动
setupshm()。在当前版本中。您正在孩子中创建 shm,然后您正在用新进程覆盖孩子。这就是内存被标记为删除的原因。
标签: c linux linux-kernel shared-memory