В настоящее время я разрабатываю сервер forking, который дает клиентам блок-уровень (существует определенный размер блока и граница отмечена) read- и запись-доступ к файлу.
Я создаю вилку для каждого клиентского соединения. Я знаю, что файлы обрабатываются, поэтому и родительский, и дочерний процесс могут получить доступ к файлу. Я также знаю, что поиск в одном процессе также повлияет на другие процессы.
Итак, вот мои вопросы:
Спасибо за помощь :)
Используйте 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()
для записи в местоположение в файле, не затрагивая указатель файла.