From 05e20db49d95955f0f00f546a7d02e4df023b805 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Rafa=C5=82=20D=C5=82ugo=C5=82=C4=99cki?= Date: Fri, 20 Jun 2014 20:10:20 +0200 Subject: [PATCH] Working communication using pipes. --- Makefile.am | 6 +++++- src/process1.c | 9 +++++---- src/process2.c | 21 +++++++++++---------- src/process3.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 69 insertions(+), 15 deletions(-) create mode 100644 src/process3.c diff --git a/Makefile.am b/Makefile.am index 9ff0cfe..a8c16f5 100644 --- a/Makefile.am +++ b/Makefile.am @@ -3,10 +3,14 @@ ACLOCAL_AMFLAGS = ${ACLOCAL_FLAGS} bin_PROGRAMS = \ bin/process1 \ - bin/process2 + bin/process2 \ + bin/process3 bin_process1_SOURCES = \ src/process1.c bin_process2_SOURCES = \ src/process2.c + +bin_process3_SOURCES = \ + src/process3.c diff --git a/src/process1.c b/src/process1.c index 4933b62..f4a1392 100644 --- a/src/process1.c +++ b/src/process1.c @@ -62,16 +62,17 @@ int main(void) { } /* - * If there were no errors parse data. + * If there were no errors or it was not just an empty newline: + * parse data. */ - if (c != EOF) { + if (c != EOF || ((i == 0) && (c == 10))) { /* If newline has been found * return entire string and release the memory */ - if (c == 10) { + if (c == 10 && (i != 0)) { buffer[i] = '\n'; write(file_descriptor, buffer, strlen(buffer)); - fprintf(stdout, "buffer: %s/%d\n", buffer, strlen(buffer)); + fprintf(stderr, "[%s] buffer: %s/%d\n", "process1", buffer, strlen(buffer)); buffer_length = 0; i = 0; diff --git a/src/process2.c b/src/process2.c index 4309e0c..07a2422 100644 --- a/src/process2.c +++ b/src/process2.c @@ -33,28 +33,29 @@ int main(void) { /* Writing to process2 */ mkfifo(write_pipe, 0666); write_descriptor = open(write_pipe, O_WRONLY); - + int number_of_characters = 0; - do { + while(1) { /* Read data from input pipe */ count = read(read_descriptor, buffer, BUFFER_STEP); - printf("fetched: %d bytes\n", count); + fprintf(stderr, "[%s] Fetched: %d bytes\n", "process2", count); if (count > 0) { - int j = 0; - for (; j < count; j++, number_of_characters++) { - if (buffer[j] == '\n') { - fprintf(stderr, "Writting about: %d\n", number_of_characters); - write(write_descriptor, number_of_characters, sizeof(number_of_characters)); + for (i = 0; i < count; i++, number_of_characters++) { + if (buffer[i] == '\n') { + fprintf(stderr, "[%s] Calculated: %d characters. Sending...\n", "process2", number_of_characters); + write(write_descriptor, &number_of_characters, sizeof(number_of_characters)); write(write_descriptor, '\n', 1); number_of_characters = 0; } } - } - } while(count > 0); + else { + break; + } + } close(read_descriptor); close(write_descriptor); diff --git a/src/process3.c b/src/process3.c new file mode 100644 index 0000000..d5be26a --- /dev/null +++ b/src/process3.c @@ -0,0 +1,48 @@ +#include +#include +#include + +/* open/read/write/close */ +#include + +/** If buffer is too small to hold entire string, it is incremented by this value */ +#define BUFFER_STEP 16 + +/** + * Program grabs data from process1, calculates number of characters in each line + * and pass the value to process3. + */ +int main(void) { + /** Named pipe used to communicate with process1 */ + char * read_pipe = "/tmp/process2pipe"; + + int read_descriptor; + + int buffer = 0; + + int i = 0; + ssize_t count = 0; + + /* Reading from process2 */ + read_descriptor = open(read_pipe, O_RDONLY); + + int number_of_characters = 0; + + while(1) { + /* Read data from input pipe */ + count = read(read_descriptor, &buffer, sizeof(int)); + + fprintf(stderr, "[%s] Fetched: %d bytes\n", "process3", count); + + if (count > 0) { + fprintf(stderr, "[%s] Process2 send: %d\n", "process3", buffer); + } + else { + break; + } + } + + close(read_descriptor); + + return 0; +} \ No newline at end of file -- 2.30.2