[comp.unix.questions] PIPES

akrishn@csserv2.ic.sunysb.edu (Arvind Krishnan) (11/20/90)

PLEASE HELP!!

I have this program which spawns 'mailx' as a child process. It then uses 
two pipes for full duplex communications with its child (mailx). 
     
     1. stdout of the child is the stdin of the parent and
     2. stdout of the parent is the stdin of the child

For some unknown reason, '1' works but '2' doesn't. The parent process can 
read the output of its child, but the child doesn't seem to be reading the
output of the parent process.

Can someone please figure out whats happening and let me know!

The code fragment at fault is as follows.

Thanks a lot in advance. Any help will be greatly appreciated.

Arvind

-------------------------------------------------------------------------------
char command[] = "1";

int start_mail() 
{ 
  int to_par[2], to_child[2];
  char buf[8];
  int flag = 0;

  if (pipe(to_par))
     return -1; 
  if (pipe(to_child))
     return -1; 

  if (fork() == 0)
   {
     close(0);
     dup2(to_child[0], 0);
     close(1);
     dup2(to_par[1], 1);
     close(to_par[1]);
     close(to_child[0]);
     close(to_par[0]);
     close(to_child[1]);
     if (execl("/usr/bin/mailx", "mailx", (char *) 0))
        fprintf(stderr,"Exec Error\n");
   }
  close(1);
  dup2(to_child[1], 1);
  close(0);
  dup2(to_par[0], 0);
  close(to_child[1]);
  close(to_par[0]);
  close(to_child[0]);
  close(to_par[1]);
  fcntl(0, F_SETFL, O_NDELAY);
  while (1)
   {
     if (flag == 0) 
        while ((flag = read(0,buf,1)) == 0);
     write(2,buf,1);
     flag = read(0,buf,1);
     if (flag == 0)
        write(1, command, 1);
   }
}