C: анонимный файл (созданный с помощью memfd_create(2)) всегда записывается в соответствии с select(2).Linux

Ответить Пред. темаСлед. тема
Anonymous
 C: анонимный файл (созданный с помощью memfd_create(2)) всегда записывается в соответствии с select(2).

Сообщение Anonymous »


У меня есть набор файловых дескрипторов, которые я «просматриваю» с помощью select. Все остальные файловые дескрипторы являются сокетами; Я хочу представить новый файловый дескриптор, чтобы я мог регистрировать изменения, управляемые событиями (без необходимости двустороннего сокета, что звучит немного «расточительно»).

После небольшого поиска я нашел функцию memfd_create; который создает «анонимные файлы». Согласно справочной странице memfd_create:

memfd_create() создает анонимный файл и возвращает дескриптор файла. это относится к этому.

Итак, моя идея такова: я напишу в этот файловый дескриптор, как если бы это был файл, и это заставит select «выскочить». Затем я прочитаю содержимое дескриптора файла и выполню соответствующую процедуру.

Однако select, похоже, регистрирует файл так, как если бы он был прочитан (даже если это не так). Дескриптор файла даже не изменился.

Вот пример кода, демонстрирующий такое поведение:

#include #include #include #include #include #define MAXMESSAGES 12 интервал основной() { беззнаковый символ message_buffer[MAXMESSAGES] = {0}; int message_buffer_fd = memfd_create("message_buffer", MFD_CLOEXEC); // ТОЧКА А ftruncate(message_buffer_fd, MAXMESSAGES); fcntl(message_buffer_fd, F_ADD_SEALS, F_SEAL_SHRINK); // записываем тестовые данные в "файл" запись( message_buffer_fd, message_buffer, sizeof (message_buffer) ); lseek( message_buffer_fd, 0, SEEK_SET ); // ТОЧКА Б fd_set fdSet; fd_set fdSetWrite; FD_ZERO(&fdSet); FD_SET(message_buffer_fd, &fdSet); FD_ZERO(&fdSetWrite); FD_SET(message_buffer_fd, &fdSetWrite); fd_set готовые_сокеты; fd_set Ready_sockets_write; в то время как (истина) { Ready_sockets = fdSet; Ready_sockets_write = fdSetWrite; //Подождем, пока FD не изменится select(FD_SETSIZE, &ready_sockets, &ready_sockets_write, nullptr, nullptr); для (int я = 0; я
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Linux»