Как установить максимальный размер FIFO в C?

Я создаю именованный канал с помощью mkfifo (2). Но я хочу установить его размер на максимум. Я использую fnctl () и PIPE_BUF, но думаю, что не смог бы этого сделать.

Это мой фрагмент кода:

#define PIPE_BUF 1048576
#define _GNU_SOURCE

int writeSomeStuffToFifo (){
    int fd;

    mkfifo(myfifo, 0666); 
    fcntl(F_SETPIPE_SZ,PIPE_BUF);

    fd = open(myfifo, O_WRONLY);
    write(fd,"1",strlen("1"));
    close(fd);
}

person javac    schedule 28.03.2019    source источник
comment
но я думаю, что не смог бы этого сделать - почему вы так думаете?   -  person Eugene Sh.    schedule 28.03.2019
comment
@EugeneSh. потому что он блокируется, когда я что-то пишу в FIFO.   -  person javac    schedule 28.03.2019
comment
fcntl должен принимать файловый дескриптор.   -  person Eugene Sh.    schedule 28.03.2019
comment
@EugeneSh. верен ли второй аргумент?   -  person javac    schedule 28.03.2019
comment
Ага, ты хочешь F_SETPIPE_SZ   -  person Eugene Sh.    schedule 28.03.2019
comment
@EugeneSh. Я очень смущен. должно быть fcntl(fd,PIPE_BUF); или fcntl(fd,F_SETPIPE_SZ);?   -  person javac    schedule 28.03.2019
comment
fcntl(fd,F_SETPIPE_SZ, PIPE_BUF ). После fd открыто конечно.   -  person Eugene Sh.    schedule 28.03.2019
comment
Другой конец у чего-то открыт для чтения? Если нет, то да, он будет блокироваться, пока это не произойдет.   -  person Shawn    schedule 28.03.2019
comment
Это неправильный подход. Вы были уже рассказали, как решить настоящую проблему. Следуйте полученным там советам.   -  person Eric Postpischil    schedule 28.03.2019
comment
@EricPostpischil Установка размера буфера - адекватный способ решить проблему, если объем данных известен.   -  person user253751    schedule 29.03.2019
comment
@immibis: OP работает над школьным упражнением (или аналогичным учебным пособием), чтобы научить их, как правильно пользоваться трубами. Неуклюжий обходной путь не достигнет намеченной цели упражнения. Кроме того, у них возникают проблемы с этим обходным путем, потому что родительский и дочерний оба открывают FIFO без синхронизации, что, по-видимому, мешает установке размера. Обойти проблему в их обходном пути будет сложнее, чем просто написать правильный код в первую очередь, который просто для родительского цикла, многократно считывая доступные данные.   -  person Eric Postpischil    schedule 29.03.2019