我正在使用共享内存应用程序,并删除段我使用以下命令:
ipcrm -M 0x0000162e (this is the key)
Run Code Online (Sandbox Code Playgroud)
但是我不知道我是否正在做正确的事情,因为当我跑步时,ipcs
我会看到相同的段但是键为0x0000000.那么内存片段真的被删除了吗?当我多次运行我的应用程序时,我看到不同的内存段,键为0x000000,如下所示:
key shmid owner perms bytes nattch status
0x00000000 65538 me 666 27 2 dest
0x00000000 98307 me 666 5 2 dest
0x00000000 131076 me 666 5 1 dest
0x00000000 163845 me 666 5 0
Run Code Online (Sandbox Code Playgroud)
究竟发生了什么?内存段真的被删除了吗?
编辑:问题是 - 如下面在接受的答案中所述 - 有两个使用共享内存的进程,直到所有进程都关闭,内存段不会消失.
我正在使用信号量来同步我的应用程序中的某些部分.
在释放信号量(sem_release)时,我收到此警告:
sem_release():无法释放密钥0xc:无效的参数
首先我不知道信号量是否被释放,但由于我没有得到"真实"的结果,我猜它不会释放.
PHP版本:5.6.30
ipcs -V =>来自util-linux 2.25.2的ipcs
这是信号量:
key semid owner perms nsems
0x0000000c 4124122 myUser 666 3
Run Code Online (Sandbox Code Playgroud)
这是代码的一部分(类Synchronization):
...
if ( !( $this->semaphoreId = sem_get( $this->id, 1 ) ) )
throw new RuntimeException( 'Error getting Semaphore.');
...
if ( !sem_acquire( $this->semaphoreId ) )
throw new RuntimeException( 'Error acquiring Semaphore.');
...
if ( !sem_release( $this->semaphoreId ) )
throw new RuntimeException( 'Error releasing Semaphore.');
Run Code Online (Sandbox Code Playgroud)
PS我只是在我的生产环境中得到这个错误,而且我无法在我的测试环境中重现/调试.
我在互联网上搜索了这条错误信息,但我一无所获.
有谁知道这个消息是什么意思?
编辑:
我使用适当的标志打开共享内存和信号量:
sem = sem_open("/some_name", O_CREAT | O_EXCL, S_IRWXU | S_IRWXG | S_IRWXO, 1);
shm = shm_open("/other_name", O_RDWR | O_CREAT | O_EXCL, S_IRWXU | S_IRWXG | S_IRWXO);
Run Code Online (Sandbox Code Playgroud)
这些调用不会失败(我检查它们),并且确实有一个进程由fork
其他exec
进程创建它们,并且其他进程确实共享内存和信号量,并且存在适当的同步。
但是,当我使用该ipcs
命令时,我看不到共享内存或信号量。这是为什么?如果它们没有出现ipcs
,我可以在哪里检查它们?
在我的ipcs
输出中,信号量数组列表中没有任何条目,共享内存中的条目与 skype、firefox 和(firefox 的)插件容器相关。我检查了它们
grep shmid /proc/*/maps # observe pid
readlink /proc/pid/exe
Run Code Online (Sandbox Code Playgroud) 我使用posix共享内存和posix未命名的信号量和pshared = 1构建了一个客户端服务器应用程序.信号量被放置在共享内存中.程序运行正常,但是当我输入ipcs -m或ipcs -s时,我没有看到我创建的任何共享内存段或信号量.为什么会这样?
/* Server main function for implementing client server program using Posix Shared Memory and Posix Unnamed Semaphores*/
#include "shm_sem.h"
int main(int argc,char ** argv)
{
int fd;
struct shmstruct *ptr;
shm_unlink(MYSHM); // delete shared memory segment, if it already exists
/* create shared memory, set its size, map it and close descriptor */
fd=shm_open(MYSHM,O_RDWR|O_CREAT|O_EXCL,0777);
ptr=mmap(NULL,sizeof(struct shmstruct),PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
// truncate the size of shared memory to the size of shmstruct
ftruncate(fd,sizeof(struct shmstruct));
close(fd);
// initialize the semaphores …
Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个C++程序来删除共享内存段.我知道可以从cmd提示符使用
ipcs -m | awk '{ print $2 }' | xargs ipcrm -m
但我正在尝试使用C++来创建一个共享内存垃圾收集器.
我们的想法是删除未附加到任何进程(nattach == 0)或status == NULL的共享内存段