Подтвердить что ты не робот

Установить размер буфера трубы

У меня есть многопоточное приложение на С++, которое использует posix-каналы для эффективного обмена данными между потоками (так что мне не нужно сходить с ума от тупиков).

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

if((pipe(pipe_des)) == -1)
    throw PipeException();

int flags = fcntl(pipe_des[1], F_GETFL, 0); // set write operation non-blocking
assert(flags != -1);
fcntl(pipe_des[1], F_SETFL, flags | O_NONBLOCK);

Теперь я хотел бы установить размер буфера для буфера на пользовательское значение (одно слово в конкретном случае).

Я искал его, но я не смог найти ничего полезного. Есть ли способ (возможно, совместимый с posix) сделать это?

Спасибо

Лоренцо

PS: я под Linux (если это может быть полезно)

4b9b3361

Ответ 1

Поскольку вы упомянули, что находитесь в Linux и, возможно, не против не переносимости, вас может заинтересовать файловый дескриптор-манипулятор F_SETPIPE_SZ, доступный с Linux 2.6.35.

int pipe_sz = fcntl(pipe_des[1], F_SETPIPE_SZ, sizeof(size_t));

После этого вызова вы найдете pipe_sz == getpagesize(), так как буфер не может быть меньше размера системной страницы. См. fcntl(2).

Ответ 2

Я googled "размер буфера linux pipe" и получил это как верхняя ссылка. В принципе, предел составляет 64 Кб и жестко закодирован.

Я не уверен, почему вы пытаетесь установить предел ниже, мне кажется странной идеей. Если вы хотите, чтобы писатель подождал, пока читатель обработает то, что он написал, вы должны использовать канал в другом направлении, чтобы читатель мог отправить обратно ack.

Ответ 3

Вы можете использовать область с разделяемой памятью (System V - like) из двух слов, одну для отправки данных, а другую для приема данных, а также реализовать с ними свои трубы. другие решения, как вы могли бы найти ранее, касаются перекомпиляции ядра, как вы хотели бы иметь его, но это не так, я полагаю.

Ciao!