2009-05-18 6 views
2

Я построил клиентское серверное приложение, используя posix shared memory и posix unnamed semafhores с pshared = 1. Семафоры помещаются в общую память. Программа работает нормально, но когда я набираю ipcs -m или ipcs -s, я не вижу сегментов разделяемой памяти или семафоров, которые я создал. Почему это так?Почему некоторые сегменты разделенной памяти posix и семафоры posix не видны для 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 
     } 
} 

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

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

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

Update:

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

+0

Я использую ipcs как тот же пользователь, который создал разделяемую память/семафоры. Сервер создает общую память и инициализирует семафоры в общей памяти. Я запускаю сервер в фоновом режиме, а затем набираю ipcs перед запуском клиента. – Anonymous

+0

Клиент самостоятельно удаляет разделяемую память и семафоры, когда это делается. – Anonymous

5

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

+1

это действительно помогло бы, если бы вы могли добавить информацию, такую ​​как использовать вместо ipcs для выполнения той же работы, но для POSIX sems и shmems, заранее. –

 Смежные вопросы

  • Нет связанных вопросов^_^