Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如果进程意外死亡,如何取消共享内存段的链接?_C_Linux_Posix - Fatal编程技术网

C 如果进程意外死亡,如何取消共享内存段的链接?

C 如果进程意外死亡,如何取消共享内存段的链接?,c,linux,posix,C,Linux,Posix,我的程序中需要共享内存,但如果进程意外死亡,共享内存段仍将存在,并在每次启动程序时导致seg故障。是否有一种方法可以确保在进程终止时取消共享内存的链接,而无需显式调用unlink?我听说SystemV可以用shmctl实现这一点,但是有没有办法用POSIX实现呢 例如,如果我在Linux上,并且拥有以下代码: char** global_msg; int shm_fd1 = shm_open("GLOBAL_MSG", O_CREAT | O_EXCL | O_RDWR, S_IRWXU | S

我的程序中需要共享内存,但如果进程意外死亡,共享内存段仍将存在,并在每次启动程序时导致seg故障。是否有一种方法可以确保在进程终止时取消共享内存的链接,而无需显式调用
unlink
?我听说SystemV可以用
shmctl
实现这一点,但是有没有办法用POSIX实现呢

例如,如果我在Linux上,并且拥有以下代码:

char** global_msg;
int shm_fd1 = shm_open("GLOBAL_MSG", O_CREAT | O_EXCL | O_RDWR, S_IRWXU | S_IRWXG);
ftruncate(shm_fd, MAX_MSG_LEN);
global_msg = (char **) mmap(NULL, MAX_MSG_LEN, PROT_READ | PROT_WRITE, MAP_SHARED, shm_fd, 0);

*global_msg = 0;
如果进程意外死亡,我如何确保“GLOBAL_MSG”未链接?

这应该可以:

char** global_msg;
int shm_fd = shm_open("GLOBAL_MSG", O_CREAT | O_EXCL | O_RDWR, S_IRWXU | S_IRWXG);
ftruncate(shm_fd, MAX_MSG_LEN);
global_msg = (char **) mmap(NULL, MAX_MSG_LEN, PROT_READ | PROT_WRITE, MAP_SHARED, shm_fd, 0);
shm_unlink("GLOBAL_MSG")
*global_msg = 0;
就像POSIX允许您在文件打开时删除文件,并且仍然可以处理内容一样,文件只有在被所有程序关闭后才会真正消失,共享内存也是如此

:

如果在对象取消链接时存在对共享内存对象的一个或多个引用,则应在shm_unlink()返回之前删除该名称,但删除内存对象内容应推迟到删除对共享内存对象的所有打开和映射引用之后


如果过程意外死亡,我们不能保证太多。每次启动程序时主动检测共享内存状态如何?@bigdataolddriver我该怎么做?首选当前工作代码,并单独使用预期的操作系统版本信息,不仅
POSIX
我不确定是否有一些内置标志。但是你可以在一个信号处理程序中完成,我想这个目的所需的函数也可以在处理程序中安全地调用。为什么现有的共享内存段会导致seg故障?您在实际代码中检查错误并进行适当的处理,对吗?我想这是可行的,但有点违背了目的。大概使用共享内存段的全部原因是,不相关的进程可以按名称打开它。这很公平,但如果另一个进程不相关,那么(1)共享内存不是作业的正确工具;(2)您如何知道何时取消共享内存的链接?如果另一个进程相关,则两个进程都可以打开内存,然后可以取消链接。