Skip to content

Instantly share code, notes, and snippets.

@dmitru
Created October 5, 2012 22:31
Show Gist options
  • Save dmitru/3842843 to your computer and use it in GitHub Desktop.
Save dmitru/3842843 to your computer and use it in GitHub Desktop.
One-way communication with FIFOs
#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#define BUF_SIZE 4096
int main(int argc, char* argv[])
{
// Запускаемся только с двумя аргументами.
if (argc < 2) {
fprintf(stderr, "Usage: %s fifo-path\n", argv[0]);
exit(1);
}
// Путь к FIFO-файлу
char* fifo_path = argv[1];
// Пытаемся открыть FIFO.
// Если FIFO еще не было открыто на другом конце, ждем пока его откроют.
int fifo_fd = open(fifo_path, O_RDONLY);
if (fifo_fd < 0) {
perror("");
exit(1);
}
// В этой точке мы успешно открыли FIFO; на другом конце FIFO также открыт.
// Можно начинать принимать сообщения!
int read_cnt; // Число считанных байт в очередном сообщении
char buf[BUF_SIZE]; // Буфер, куда мы складываем приходящие сообщения
fprintf(stderr, "Reader: connection established! Ready for communication.\n");
// Пока есть что читать из FIFO, т.е. выполняется одно из двух:
// 1. пока его не закрыл последний пишущий процесс
// 2. в FIFO нем еще остались несчитанные байты
while ((read_cnt = read(fifo_fd, buf, BUF_SIZE)) > 0) {
if (read_cnt < 0) {
perror("");
exit(1);
}
fprintf(stderr, "The message recieved:\n");
// Печатаем полученное сообщение в стандартный вывод
write(STDOUT_FILENO, buf, read_cnt);
}
fprintf(stderr, "Session closed.\n");
return 0;
}
#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#define BUF_SIZE 4096
int main(int argc, char* argv[])
{
if (argc < 2) {
fprintf(stderr, "Usage: %s fifo-path\n", argv[0]);
exit(1);
}
char* fifo_path = argv[1];
int fifo_fd = open(fifo_path, O_WRONLY);
if (fifo_fd < 0) {
perror("");
exit(1);
}
int read_cnt;
int write_cnt;
char buf[BUF_SIZE];
fprintf(stderr, "Writer: connection established! Ready for communication.\n");
while ((read_cnt = read(STDIN_FILENO, buf, BUF_SIZE)) > 0) {
if (read_cnt < 0) {
perror("");
exit(1);
}
write_cnt = write(fifo_fd, buf, read_cnt);
if (write_cnt != read_cnt) {
fprintf(stderr, "write() failed to write specified number of bytes.\n");
exit(1);
}
}
fprintf(stderr, "Session closed.\n");
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment