// gcc -std=gnu99 -Wall -Wextra writer.c -o writer #include #include #include #include #include #include #include #include static void fail(const char *str) { fprintf(stderr, "W: %s\n", str); exit(EXIT_FAILURE); } int main(void) { int flags = fcntl(STDOUT_FILENO, F_GETFL); if (flags == -1) fail("Cannot get stdout file status flags"); if (fcntl(STDOUT_FILENO, F_SETFL, flags | O_NONBLOCK) == -1) fail("Setting stdout to non-blocking mode failed"); static unsigned char buf[64 << 10]; int blocking = 0; int i = 0; while (i < 256) { int ret = write(STDOUT_FILENO, buf, sizeof(buf)); if (ret == -1 && errno == EAGAIN) { blocking++; continue; } if (ret != sizeof(buf)) fail("Unexpected number of bytes"); memset(buf, ++i, sizeof(buf)); } if (!blocking) fail("Was never blocking, read was too fast"); if (fcntl(STDOUT_FILENO, F_SETFL, flags) == -1) fail("Restoring stdout file status flags failed"); if (close(STDOUT_FILENO)) fail("Error closing stdout"); return EXIT_SUCCESS; }