Can someone tell me what is wrong with this code?
Thus, it creates input and output channels, and fork-exec creates the sort program. The parent reads the dictionary /usr/share/dict/words and writes it to the channel from dup2() 'd to sort , and also reads its output by printing it to the terminal (standard output from the parent), Or at least that should happen.
In the opposite direction, it says that the parent element is hanging on read() on line 130 (marked with the comment "XXX"). It's almost as if sort doesn't know the end of the file, but closing the end of the pipeIn record should "signal" this, right?
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <errno.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> int main(int argc, char** argv) { int pipeIn[2]; int pipeOut[2]; if ((pipe(pipeIn)) == -1) { perror("pipe"); exit(EXIT_FAILURE); } if ((pipe(pipeOut)) == -1) { perror("pipe"); exit(EXIT_FAILURE); } pid_t child = fork(); if (child == 0) { // This is child! if ((dup2(pipeIn[0], STDIN_FILENO)) == -1) { perror("dup2"); exit(EXIT_FAILURE); } if ((dup2(pipeOut[1], STDOUT_FILENO)) == -1) { perror("dup2"); exit(EXIT_FAILURE); } if ((dup2(pipeOut[1], STDERR_FILENO)) == -1) { perror("dup2"); exit(EXIT_FAILURE); } if ((close(pipeIn[0])) == -1) { perror("close"); exit(EXIT_FAILURE); } if ((close(pipeOut[1])) == -1) { perror("close"); exit(EXIT_FAILURE); } if ((execlp("sort", "-r", NULL)) == -1) { perror("execlp"); exit(EXIT_FAILURE); } } else if (child == -1) { perror("fork"); exit(EXIT_FAILURE); } else { // This is parent! if ((close(pipeIn[0])) == -1) { perror("close"); exit(EXIT_FAILURE); } if ((close(pipeOut[1])) == -1) { perror("close"); exit(EXIT_FAILURE); } int dict = open("/usr/share/dict/words", O_RDONLY); if (dict == -1) { perror("open"); exit(EXIT_FAILURE); } char buf[1024]; int count; while ((count = read(dict, buf, sizeof(char) * 1024)) > 0) { putchar('.'); if ((write(pipeIn[1], buf, count)) == -1) { perror("write 1"); exit(EXIT_FAILURE); } } if (count == -1) { perror("read"); exit(EXIT_FAILURE); } if ((close(dict)) == -1) { perror("close"); exit(EXIT_FAILURE); } if ((close(pipeIn[1])) == -1) { perror("close"); exit(EXIT_FAILURE); } while ((count = read(pipeOut[0], buf, sizeof(char) * 1024)) > 0) // XXX { putchar('!'); if ((write(STDOUT_FILENO, buf, count)) == -1) { perror("write 2"); exit(EXIT_FAILURE); } } if (count == -1) { perror("read"); exit(EXIT_FAILURE); } if ((close(pipeOut[0])) == -1) { perror("close"); exit(EXIT_FAILURE); } } return EXIT_SUCCESS; }
Thank you for any input (pardon pun).
source share