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>
