У меня есть общая область общей памяти, которую несколько процессов могут читать и записывать в нее.Я сталкиваюсь с этой проблемой, когда использую shm_open()
для доступа к общей памяти и mmap()
для записи в файл отображения памяти.Тем не менее, после нескольких вызовов моего метода-оболочки я столкнусь с ERRNO 24
(слишком много открытых файлов) при вызове shm_open()
.
Я попытался использовать shm_unlink()
, но это закрывает имя, связанное спространство общей памяти, и я не могу снова получить доступ к этой памяти с соответствующим именем.Как закрыть дескриптор файла и оставить имя, связанное с общей памятью, одним?
По сути, я хочу, чтобы функция-обертка делала это:
public static void Write(string name, int size, int offset, List<byte> data)
{
int fd = shm_open(name, O_RDWR, S_IWUSR | S_IWOTH);
if(fd < 0) { // throw error }
IntPtr *ptr = mmap(null, shmSize, PROT_WRITE, MAP_SHARED, fd, 0);
if(ptr < 0) { // throw error }
foreach(byte in data) { // write to shared memory }
munmap(ptr, shmSize);
shm_close(fd) // <-- I want to do equivalent of this
}
Чтобы все было немного сложнее,Я занимаюсь разработкой с использованием C # в среде Linux и использую импорт DLL для вызова собственных функций Linux.