#include #include #include #include #include #include #include #include #include #include #include #define WARN(...) do { fprintf(stderr, __VA_ARGS__); fputc('\n', stderr); } while(0) #define ERROR(...) do { WARN(__VA_ARGS__); exit(1); } while(0) void nonblock(int fd, int nb) { int flags = fcntl(fd, F_GETFL); flags &= ~O_NONBLOCK; if (nb) flags |= O_NONBLOCK; if (fcntl(fd, F_SETFL, flags) == -1) ERROR("failed: fcntl: %s", strerror(errno)); } fd_set canread_fds; int canread(int fd) { int count; int fd_max = fd + 1; struct timeval timeout = { 0, 0 }; fd_set *s = &canread_fds; FD_SET(fd, s); count = select(fd_max, &canread_fds, NULL, NULL, &timeout); FD_CLR(fd, s); return count > 0; } int main(void) { int fd; int n; char *msg = "hello world!"; int i; long delay = 1; FD_ZERO(&canread_fds); fd = open("fifo", O_RDWR|O_NONBLOCK); // fd = open("fifo", O_WRONLY); WARN("opened %d", fd); nonblock(fd, 0); WARN("made blocking"); for (i=0; i<10; ++i) { n = write(fd, msg, strlen(msg)+1); WARN("%d", n); } WARN("wrote"); while (canread(fd)) { if (delay > (int)1e9) { sleep(1); } else { struct timespec d = { 0, delay }; nanosleep(&d, NULL); delay *= 2; } } WARN("final delay: %ld", delay); close(fd); WARN("closed"); return 0; }