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; +}