read() and write() are what everyone expects. They are what programmers are used to at a low level. while (len > 0) { ssize_t ret; ret = write(fd, buf, len); if (ret < 0) { if (errno == EAGAIN || errno == EINTR) continue; err(1, "write failed: "); } buf += ret; len -= ret; }