Добрый день
Делаю сплайс из неблокируемого сокета в пайп.
Псевдокод:
if(pipe(splice_pipe) < 0)
{
perror("pipe");
return -1;
}
pipe_size = fcntl(splice_pipe[0], F_GETPIPE_SZ))
...................
//При событии поступления данных на сокет
if((read = splice(
sock_fd,
NULL,
splice_pipe[1],
NULL,
pipe_size - pipe_bytes_num,
SPLICE_F_MOVE|SPLICE_F_NONBLOCK
)) <0)
{
perror("splice");
return -1;
}
pipe_bytes_num += read;
Ради шалости попробовала заведомо уменьшить на килобайт-другой значение переменной pipe_size чтобы не заполнять подзавязку - не дает результата. А вот если уменьншить pipe_size килобайт на 20, то EAGAIN не выскакивает.
Лишний пустой вызов splice очень напрягает, особенно часто это может быть если медленный читатель из пайпа, а писатель очень быстрый.
Код не могу привести полностью из-за размазанности по проекту.
Откуда берется EAGAIN, если допустить что в коде нет попыток переполнения пайпа и в буфере сокета есть данные?