#include #include #include #include #define BUFSIZE 1024 #define INPUT 0 #define OUTPUT 1 int main(int argc, char *argv[]) { /* initialization variables */ int fd_in; int fd_out; int pfd[2]; int status; char buf[BUFSIZE]; char buf2[BUFSIZE]; int n_read; int n_written; fd_in = open(argv[1], O_RDONLY); if(fd_in < 0) { perror("can't open %s for input", argv[1]); return 1; } fd_out = creat(argv[2], 0644); if(fd_out < 0) { perror("can't open %s for output", argv[2]); return 1; } close(INPUT); dup(fd_in); close(OUTPUT); dup2(fd_out); n_read = read(fd_in, buf, BUFSIZE); pipe(pfd); if(fork() != 0) { if(fork() != 0) /* parent */ { wait(&status); wait(&status); } else /* child2 */ { /* setup for writing */ close(pfd[0]); close(OUTPUT); if(dup(pfd[1]) == -1) { perror("dup2 failed"); } close(pfd[1]); execl("convert", "convert", buf, (char *) 0); } } else { /* child1 */ /* setup for reading */ close(pfd[1]); close(INPUT); if(dup(pfd[0]) == -1) { perror("dup2 failed"); } close(pfd[0]); /* get stdin, which should be output from child2 */ scanf("%s", buf2); execl("count", "count", buf2, (char *) 0); } close(fd_in); close(fd_out); }