Como afirmado por @MelBoyce em seu comentário, isso é por causa da natureza conceitual de um pipe. Ele tem uma entrada e uma saída e você lê os bytes da saída na mesma ordem em que foram gravados na entrada. Pipes não são arquivos ou ponteiros comuns, você não deve ler e escrever em qualquer lugar. Você é forçado a ler os primeiros bytes que entraram no pipe e que nunca serão lidos ainda.
Pipes podem ser implementados como um buffer na memória, mas a implementação pode variar se no futuro, se outra forma mais eficiente de fazer isso for inventada, por exemplo. No entanto, a natureza conceitual do pipe não será alterada. Você ainda usará as mesmas chamadas de sistema read(1)
e write(1)
e elas ainda se comportarão da mesma maneira. Os descritores de arquivo que você recebe quando chama pipe(1)
são usados para forçá-lo a usar o canal corretamente (e adicionalmente fornecer algum controle de acesso). Dessa forma, futuras modificações na implementação não irão quebrar seu código.