#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)); } int main(void) { int fd; int n; char buf[13]; int i; fd = open("fifo", O_RDWR|O_NONBLOCK); WARN("opened %d", fd); nonblock(fd, 0); WARN("made blocking"); for (i=0; i<20; ++i) { n = read(fd, buf, sizeof(buf)); WARN("%d", n); buf[sizeof(buf)-1] = '\0'; write(STDOUT_FILENO, buf, n); } WARN("read"); close(fd); WARN("closed"); return 0; }