почему некоторые сегменты общей памяти posix и семафоры posix не видны ipcs - PullRequest
2 голосов
/ 19 мая 2009

Я создал клиент-серверное приложение, используя общую память 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 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
        }  
}

/* 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
    }  
}

Ответы [ 2 ]

5 голосов
/ 19 мая 2009

ipcs отображает информацию о системе System V IPC. Семафоры POSIX и разделяемая память - это независимая (и лучше) система, которая не контролируется «ipcs».

2 голосов
/ 19 мая 2009

Пара вопросов:

  • Работаете ли вы ipcs как тот же пользователь, который создал общую память / семафоры (или как суперпользователь)?
  • Запускаете ли вы ipcs во время работы программы? (Вы уверены, что он не удаляет их при выходе?)

Обновление

На самом деле, после прочтения этой темы Я не уверен, что ipcs должен показывать семафоры POSIX. Я попробовал ваш пример кода (с некоторыми изменениями, чтобы исправить ошибки компиляции), и вы можете увидеть сегмент общей памяти в каталоге /dev/shm.

...