#include <unistd.h>
#include <cerrno>
#include <iostream>
#include <stdexcept>
#include <string>
int main() {
    int fd[2]; if (::pipe(fd) != 0) throw std::runtime_error("pipe");
    const std::string input="abcdef";
    std::size_t sent=0;
    while (sent<input.size()) {
        const ssize_t n=::write(fd[1],input.data()+sent,input.size()-sent);
        if(n<0 && errno==EINTR) continue;
        if(n<=0) throw std::runtime_error("write");
        sent+=static_cast<std::size_t>(n);
    }
    if(::close(fd[1])!=0) throw std::runtime_error("close writer");
    std::string output; int chunks=0; char buffer[2];
    for(;;) {
        const ssize_t n=::read(fd[0],buffer,sizeof buffer);
        if(n<0 && errno==EINTR) continue;
        if(n<0) throw std::runtime_error("read");
        if(n==0) break;
        output.append(buffer,static_cast<std::size_t>(n)); ++chunks;
    }
    if(::close(fd[0])!=0 || output!=input || chunks!=3)
        throw std::runtime_error("pipe invariant");
    std::cout<<output<<"|chunks="<<chunks<<'\n';
}
