c-SHMDT和SHMCTL未删除共享内存位置



我目前正在练习使用fork将一些行写入共享内存,并在打印完所有行后终止。根据我的理解,在程序终止后,shmdt和shmctl会在执行后删除共享内存位置。我有这两条语句,在程序结束后,我仍然可以从运行程序中看到共享内存位置。为了澄清,我在终端killall-u中运行,然后在ipcrm-all中运行,以确保在运行时没有共享内存位置。在我运行之后,应该没有内存位置。

#include <stdio.h>
#include <sys/shm.h>
#include <sys/stat.h>
int
main()
{
int           pid;
int             segment_id;
char           *shared_memory="User";
const int       segment_size = 4096;
segment_id = shmget(IPC_PRIVATE, segment_size, S_IRUSR | S_IWUSR);
shared_memory = (char *) shmat(segment_id, NULL, 0);

sprintf(shared_memory, "I am process A");
printf("%sn", shared_memory);

if (fork() == 0) { 
sprintf(shared_memory, "I am process B");
printf("%sn", shared_memory);
pause();
exit(0);
} else {
if (fork() == 0){
sprintf(shared_memory, "I am process C");
printf("%sn", shared_memory);
pause();
exit(0);
}else{
usleep(100);
exit(0);
}

}
if (shmdt(shared_memory) == -1) {
fprintf(stderr, "Unable to detachn");
}
shmctl(segment_id, IPC_RMID, NULL);
return 0;
}

TL;DR:向您的子进程发送信号,并在usleep(100)之后移除exit(0)

父进程创建分段,然后分叉。分叉进程调用pause(),等待一个信号——似乎没有信号。

if/else/[if/else]的最后一个分支休眠然后退出,所以您对shmdt()的尝试永远不会执行。

最新更新