Created
October 5, 2012 22:31
-
-
Save dmitru/3842843 to your computer and use it in GitHub Desktop.
One-way communication with FIFOs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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; | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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