From f51467cd80cc5b15b7b55da682547ffc15ac09f4 Mon Sep 17 00:00:00 2001 From: Alexander Popov Date: Mon, 24 Mar 2025 23:56:25 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9D=D0=B0=D0=B1=D1=80=D0=BE=D1=81=D0=BE?= =?UTF-8?q?=D0=BA=20=D0=BF=D1=80=D0=B8=D0=BC=D0=B5=D1=80=D0=B0=20=D1=80?= =?UTF-8?q?=D0=B0=D0=B1=D0=BE=D1=82=D1=8B=20=D1=81=20FIFO?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- code/C/FIFO/.gitignore | 4 +++ code/C/FIFO/README.md | 9 ++++++ code/C/FIFO/reader.c | 67 ++++++++++++++++++++++++++++++++++++++++++ code/C/FIFO/writer.c | 18 ++++++++++++ 4 files changed, 98 insertions(+) create mode 100644 code/C/FIFO/.gitignore create mode 100644 code/C/FIFO/README.md create mode 100644 code/C/FIFO/reader.c create mode 100644 code/C/FIFO/writer.c diff --git a/code/C/FIFO/.gitignore b/code/C/FIFO/.gitignore new file mode 100644 index 0000000..f0fd549 --- /dev/null +++ b/code/C/FIFO/.gitignore @@ -0,0 +1,4 @@ +example_fifo + +reader +writer diff --git a/code/C/FIFO/README.md b/code/C/FIFO/README.md new file mode 100644 index 0000000..45b9392 --- /dev/null +++ b/code/C/FIFO/README.md @@ -0,0 +1,9 @@ +```sh +clear; clang -std=c99 -o reader reader.c && ./reader +# или +tcc -run reader.c +``` + +```sh +tcc -run writer.c +``` diff --git a/code/C/FIFO/reader.c b/code/C/FIFO/reader.c new file mode 100644 index 0000000..b447bc7 --- /dev/null +++ b/code/C/FIFO/reader.c @@ -0,0 +1,67 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#define FIFO_NAME "example_fifo" + +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) { + char buffer[BUFSIZ]; + ssize_t len = read(fd, buffer, sizeof(buffer)); + if (len < 0) { + perror("read"); + return EXIT_FAILURE; + } + + printf("Data: %s\n", buffer); + } 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; +} diff --git a/code/C/FIFO/writer.c b/code/C/FIFO/writer.c new file mode 100644 index 0000000..8d7c29f --- /dev/null +++ b/code/C/FIFO/writer.c @@ -0,0 +1,18 @@ +#include +#include +#include +#include + +#define FIFO_NAME "example_fifo" + +int main() { + char message[1024] = "OLOLO MESSAGE"; + + mkfifo(FIFO_NAME, 0666); + int fd = open(FIFO_NAME, O_WRONLY); + write(fd, message, sizeof(message)); + close(fd); + // unlink(FIFO_NAME); + + return 0; +}