标签: ipcs

在Linux中使用ipcrm删除共享内存

我正在使用共享内存应用程序,并删除段我使用以下命令:

 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)

究竟发生了什么?内存段真的被删除了吗?

编辑:问题是 - 如下面在接受的答案中所述 - 有两个使用共享内存的进程,直到所有进程都关闭,内存段不会消失.

shared-memory ipcs

20
推荐指数
2
解决办法
8万
查看次数

sem_release():无法释放密钥0xc:无效的参数

我正在使用信号量来同步我的应用程序中的某些部分.

在释放信号量(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我只是在我的生产环境中得到这个错误,而且我无法在我的测试环境中重现/调试.

我在互联网上搜索了这条错误信息,但我一无所获.

有谁知道这个消息是什么意思?

编辑:

  1. 每次运行脚本时都不会显示错误消息.
  2. 我确实得到错误'错误获取信号量'与类似的警告'sem_acquire():无法获取密钥0xc:标识符被删除',但不是在同一时间(天)我得到'错误释放信号量'
  3. 上面的类在整个地方使用不同的键来同步部分应用程序代码.我没有其他任何问题的问题.是的,这个键"12"/"0xc"仅在一个地方和同一个用户使用.
  4. 不应该出现权限问题,因为如果你检查信号量的权限"0xc"是"666"

php semaphore ipcs

8
推荐指数
1
解决办法
340
查看次数

ipcs 不显示我的共享内存和信号量

我使用适当的标志打开共享内存和信号量:

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)

c linux shared-memory ipcs

5
推荐指数
2
解决办法
3384
查看次数

为什么一些posix共享内存段和posix信号量对ipcs不可见

我使用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)

posix semaphore client-server shared-memory ipcs

2
推荐指数
1
解决办法
2779
查看次数

使用C++程序删除unix共享内存段

我正在尝试编写一个C++程序来删除共享内存段.我知道可以从cmd提示符使用

ipcs -m | awk '{ print $2 }' | xargs ipcrm -m

但我正在尝试使用C++来创建一个共享内存垃圾收集器.

我们的想法是删除未附加到任何进程(nattach == 0)或status == NULL的共享内存段

c++ unix shared-memory ipcs inter-process-communicat

1
推荐指数
1
解决办法
3989
查看次数