Разветвленный сервер, один файл - доступ к ПО

0

В настоящее время я разрабатываю сервер forking, который дает клиентам блок-уровень (существует определенный размер блока и граница отмечена) read- и запись-доступ к файлу.

Я создаю вилку для каждого клиентского соединения. Я знаю, что файлы обрабатываются, поэтому и родительский, и дочерний процесс могут получить доступ к файлу. Я также знаю, что поиск в одном процессе также повлияет на другие процессы.

Итак, вот мои вопросы:

  1. Как заблокировать поиск в вилках против других вилок? Mutex?
  2. Может ли вилка записывать в некоторые блоки, в то время как другие вилки читают разные блоки?
  3. Если возможно 2, как я могу предохранить forks от чтения блоков, которые в настоящее время записываются?

Спасибо за помощь :)

  • 0
    Почему бы не открыть файл отдельно в каждом процессе, вместо того, чтобы использовать один и тот же дескриптор файла?
  • 0
    Мне все еще нужно было бы заблокировать блоки, которые пишутся. Кроме того, не ухудшит ли это производительность?
Показать ещё 4 комментария
Теги:
file-io
server
fork

1 ответ

0
Лучший ответ

Используйте lockf() чтобы заблокировать блок файла, который вы пишете, в каждом процессе.

Поскольку секция блокировки начинается с текущего смещения файла, я думаю, что лучше всего открыть файл отдельно в каждом процессе, а не использовать один и тот же дескриптор файла. Таким образом, вы можете искать в каждом процессе, не затрагивая других. В противном случае в дополнение к файловым замкам вам понадобится взаимное исключение вокруг lseek().

Таким образом, код для записи в блок будет выглядеть примерно так:

lseek(fd, block_pos, SEEK_SET);
lockf(fd, F_LOCK, block_size);
write(fd, buf, block_size);
lseek(fd, block_pos, SEEK_SET);
lockf(fd, F_ULOCK, block_size);

Если вы используете общие дескрипторы файлов, вы можете использовать fcntl() для установки блокировок со смещением, которые вы указываете в вызове, и pwrite() для записи в местоположение в файле, не затрагивая указатель файла.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню