#include #include #include #include #include #include #include #include #include #define FIFO_NAME "cvMat" int main() { unsigned int timeout_seconds = 2; while (true) { int fd = open(FIFO_NAME, O_RDONLY | O_NONBLOCK); if (fd < 0) { perror("open"); return EXIT_FAILURE; } struct pollfd waiter = {.fd = fd, .events = POLLIN}; while (true) { bool stop = false; int poll_result = poll(&waiter, 1, timeout_seconds * 1000); switch (poll_result) { case 0: puts("No data from fifo"); break; case 1: if (waiter.revents & POLLIN) { std::vector buff; char tempBuff[256]; ssize_t bytesRead; while ((bytesRead = read(fd, tempBuff, sizeof(tempBuff))) > 0) buff.insert(buff.end(), tempBuff, tempBuff + bytesRead); printf("Received: %d\n", buff.size()); cv::Mat img(cv::Size(810, 1080), CV_8UC3, buff.data()); cv::imwrite("received.jpg", img); } else if (waiter.revents & POLLERR) { puts("Got a POLLERR"); return EXIT_FAILURE; } else if (waiter.revents & POLLHUP) { stop = true; // Writer closed its end break; } break; default: perror("poll error"); return EXIT_FAILURE; } if (stop) break; } if (close(fd) < 0) { perror("close"); return EXIT_FAILURE; } } return EXIT_SUCCESS; }