Date: Tue, 22 Dec 1998 01:21:36 PST From: Michael Ryan <mike@NetworX.ie> To: FreeBSD Support <questions@FreeBSD.ORG> Subject: Mystery with pipe(), fork() and dup() Message-ID: <ECS9812220136A@NetworX.ie>
next in thread | raw e-mail | index | archive | help
Hi all, This one has me completely stumped. I wanted to write a program which has the same effect as grep pattern | more so I wrote the program listed below. As it stands, it works perfectly every time. However, if I change the line which reads if (pid == 0) to read if (pid) it never works! The stdio for 'more' seems to get screwed up. Can anybody explain why it doesn't work? Also, to my amazement, if I leave the line which reads if (pid == 0) alone, but delete the line which reads close(fd[1]); that is the 3rd last line of main(), it also fails to work! Deleting the other "close(fd[n])" calls don't seem to make any difference. I'd be extremely grateful to anybody who can shed light on this. The program: ---------------------------------------------------------------- #include <stdio.h> #include <unistd.h> #define GREP "grep" #define MORE "more" void main(int, char **); static void error(char *); static void error (char *msg) { fprintf(stderr, "Error: %s\n", msg); exit(1); } void main (int argc, char **argv) { int fd[2]; pid_t pid; if (pipe(fd)) error("pipe() failed"); if ((pid=fork()) < 0) error("fork() failed"); if (pid == 0) { close(1); if (dup(fd[1]) != 1) error("dup(1) failed"); close(fd[0]); close(fd[1]); argv[0] = GREP; execvp(GREP, argv); error("execvp(" GREP ") failed"); } close(0); if (dup(fd[0]) != 0) error("dup(0) failed"); close(fd[0]); close(fd[1]); execlp(MORE, MORE, 0); error("execlp(" MORE ") failed"); } ---------------------------------------------------------------- Thanks for any help. Bye, Mike mike@NetworX.ie www.NetworX.ie --- To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-questions" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?ECS9812220136A>