Из приведенных выше комментариев подумайте, что здесь имеет смысл добавить небольшое объяснение того, как работает буферизация для потоков ввода / вывода.
Что происходит за кулисами при вызове printf(3)
, и тому подобное:данные записываются в буфер, пока буфер не заполнится или не произойдет какой-либо триггер.Содержимое буфера затем копируется из буфера в фактическое устройство вывода / другой буфер вывода ... Триггер обычно сталкивается с концом строки (\n
в Linux / Unix).Таким образом, грубая версия этой буферизации выглядит так:
struct buffered_file_t {
char* buffer;
size_t capacity;
size_t current_char;
FILE* file;
};
void flush_buffered(struct buffered_file_t* file) {
assert(0 != file);
assert(0 != file->buffer);
fwrite(file->buffer, file->current_char, 1, file->file);
file->current_char = 0;
}
void print(struct buffered_file_t* file, const char* str) {
assert(0 != file);
assert(0 != file->buffer);
assert(0 != str);
for(size_t i = 0; 0 != str[i]; ++i) {
if(file->current_char >= file->capacity - 1) flush_buffered(file);
file->buffer[file->current_char++] = str[i];
if('\n' == str[i]) flush_buffered(file);
}
}
Теперь, если вы вызовете print
как
const size_t BUFSIZE = 100;
struct buffered_file_t stdout_buffered = {
.buffer = calloc(1, BUFSIZE),
.capacity = BUFSIZE,
.current_char = 0,
.file= stdout,
};
print(&stdout_buffered, "Naglfar\n");
print(&stdout_buffered, "Surthur");
Вы не увидите, что Surthur
появится в stdout
,Чтобы записать его из буфера в stdout
, необходимо либо
- явно
flush_buffered
вызвать - Отключить буферизацию путем уменьшения размера буфера (
buffered_file.capacity = 1
впример выше)
В вашем случае вы не можете явно вызвать fflush(3)
(это то, что вы указали в качестве требования).таким образом, остается только отключить буферизацию.
Как это сделать, зависит от ОС, ИМХО.Для Linux посмотрите на stdbuf(1)
из пакета Coreutils, чтобы узнать, как включить буферизацию для определенных потоков сторонних процессов.