Знатооки юникса help

vertyal17

Вот вобщем когда файл записывается на диск, он записывается не непрерывнно, а некоторым размером буфера сразу. (Типа был файл 0 байт потом резко сразу 30000 байт и т.д например)
Как можно этот размер регулировать? Требуется выставить его поменьше, чтобы чаще записывал помаленьку.
Файл передается по протоколу gsiftp в интернете, на на диск пишет его скорее всего какойто процесс, скорее всего он его записывает по проостому через write(..,..,..) но внутрь этого процесса доступа нет, т.е. измеенить его код нельзя(если ктот скажет чтобы в том процессе вызвать какой-нибудь setbufsize)
Задача, посчитать скорость передачи у меня, а поскольку скорость очень маленькая, то это будет небольшая потеря что файл пишется помаленьку, зато можно более точно определить количество уже переданных байт.
Спасибо за ответ на прошлый вопрос.

stat2497492

Если он его пишет через write, то размер файла увеличивается точно такими же кусками, какими он передаётся функции write. В этом случае скорее всего изменить ничего нельзя. Если используется fwrite, то запись идёт блоками, причём размер блока по умолчанию задаётся где-то в недрах libc.so. В этом случае можно попробовать подсунуть свой собственный libc.so... В любом случае требуется длительная и кропотливая работа.

rfgbnfy

а если через shell писать - то там какой механизм? типа результаты в файл перенаправлять через > ?

Caha007

да нет, можно
перепиши write на уровне ядра и статически задай размер блока

Viktor13

> перепиши write на уровне ядра и статически задай размер блока\
Это не поможет. Если прога формирует блок на 30Kb, а потом записывает его одним writeом, то никакое переписывание write не поможет этот размер изменить...

Viktor13

> а если через shell писать - то там какой механизм? типа результаты в файл перенаправлять через > ?
В этом случае для конкретного процесса файловый дескриптор номер 1 (stdout) указывает не на терминал, а на тот файл, в который перенаправлены результаты. А какого размера блоками писать в этот файл -- это уже зависит от программы (или опять же от libc). То есть shell перенаправляемые данные через себя не пропускает и следовательно влиять на размер блоке не может.

Landstreicher

Может не в тему, но для таких случаев я бы посоветовал посмотреть исходники. Если нет - то strace/ltrace на предмет вызывов read/write.
Оставить комментарий
Имя или ник:
Комментарий: