почему некоторые сегменты разделяемой памяти posix и семафоры posix не видны ipcs
-
22-08-2019 - |
Вопрос
Я создал клиент-серверное приложение, используя общую память 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
}
}
Решение
Пара вопросов:
- Ты убегаешь
ipcs
как тот же пользователь, который создал общую память / семафоры (или как суперпользователь)? - Ты убегаешь
ipcs
во время работы программы?(Вы уверены, что он не удаляет их при выходе?)
Обновить:
На самом деле, после прочтения этого Нитки Я не уверен, что ipcs должен иметь возможность показывать семафоры POSIX.Я попробовал ваш пример кода (с некоторыми правками для исправления ошибок компиляции), и вы можете увидеть сегмент общей памяти в /dev/shm
справочник.
Другие советы
ipcs отображает информацию о системе V Система IPC.Семафоры POSIX и разделяемая память - это независимая (и лучшая) система, которая не контролируется "ipcs".