Client server 为什么某些posix共享内存段和posix信号量对IPC不可见

Client server 为什么某些posix共享内存段和posix信号量对IPC不可见,client-server,posix,shared-memory,semaphore,ipcs,Client Server,Posix,Shared Memory,Semaphore,Ipcs,我使用posix共享内存和pshared=1的posix未命名信号量构建了一个客户机-服务器应用程序。信号量放在共享内存中。该程序运行良好,但当我键入ipcs-m或ipcs-s时,我看不到我创建的任何共享内存段或信号量。为什么会这样 /* Server main function for implementing client server program using Posix Shared Memory and Posix Unnamed Semaphores*/ #include "s

我使用posix共享内存和pshared=1的posix未命名信号量构建了一个客户机-服务器应用程序。信号量放在共享内存中。该程序运行良好,但当我键入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 in shared memory  
    sem_init(&ptr->client_mutex,1,1); // set client semaphore to 1  
    sem_init(&ptr->server_mutex,1,0); // set server semaphore to 0  
    for(;;)
        {
        serverPosixShmSem(ptr); // calling server
        }  
}

有几个问题:

  • 您是否以创建共享内存/信号量的同一用户(或超级用户)的身份运行
    ipcs
  • 程序运行时,您是否正在运行
    ipcs
    ?(您确定退出时不会删除它们吗?)
更新:


实际上,在阅读了本文之后,我不确定ipcs是否应该能够显示POSIX信号量。我尝试了您的示例代码(通过一些编辑来修复编译错误),您可以在
/dev/shm
目录中看到共享内存段。

ipcs显示有关System V IPC系统的信息。POSIX信号量和共享内存是一个独立(更好)的系统,不受“ipcs”的监控。

我使用ipcs作为创建共享内存/信号量的同一用户。服务器创建共享内存并初始化共享内存中的信号量。我在后台运行服务器,然后在运行客户机之前键入ipcs。完成后,客户机将单独删除共享内存和信号量。如果您可以添加一些信息,例如,除了POSIX sems和shmems之外,使用什么来代替ipcs来完成相同的工作,这将非常有帮助,提前感谢。
/* 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 in shared memory  
    sem_init(&ptr->client_mutex,1,1); // set client semaphore to 1  
    sem_init(&ptr->server_mutex,1,0); // set server semaphore to 0  
    for(;;)
    {
        serverPosixShmSem(ptr); // calling server
    }  
}