Как закрыть файловый дескриптор shm_open, не отключая его? - PullRequest
0 голосов
/ 19 декабря 2018

У меня есть общая область общей памяти, которую несколько процессов могут читать и записывать в нее.Я сталкиваюсь с этой проблемой, когда использую 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.

1 Ответ

0 голосов
/ 19 декабря 2018

Функция close - это механизм закрытия файлового дескриптора любого типа, включая те, которые относятся к общей памяти.

...