Witjacie,
Pisze program tworzący łacze komunikacyjne miedzy potomkiem i rodzicem.
Problem jest taki ze w potomku chce to łącze podpiąc pod STDIN/OUT
STDIN_FILENO sie ładnie podpina, a STDOUT_FILENO juz nie . Nie ma błędu w ogóle program głupieje...

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>

#define MAXLINE 2048

int main(int argc,char* argv[]) {
  
  int fd1[2],fd2[2],n,j,i=0;
  pid_t pid,*tmp,ppid=getpid();
  char line[MAXLINE];
  memset(line,0,MAXLINE);
  
  if(pipe(fd1) < 0 || pipe(fd2) < 0) {
    printf("error in pipe(): %s\n",strerror(errno));
    exit(1);
  }
  
  if( (pid = fork()) < 0) {
    printf("error in fork(): %s\n",strerror(errno));
    exit(1);
  } else if(pid > 0) { // proces macierzysty
    sleep(1);
    //dwa lacza jedno do pisania, drugie do odcztu
    close(fd1[0]); // zamknij odczyt
    close(fd2[1]); // zamknij zapis
    //fd1 lacze do pisania
    //fd2 lacze do czytania
    
    strcpy(line+i,(char*)&ppid); // zapisz swoj pid
    i += sizeof(ppid);
    
    
    if( write(fd1[1],line,strlen(line)) != strlen(line)) { // wyslij swoj pid
      printf("error in write(): %s\n",strerror(errno));
      exit(1);
    }

  } else { // dziecko

    close(fd1[1]);
    close(fd2[0]); 
       
    if(fd1[0] != STDIN_FILENO) { // podpiecie pod standardowe wejscie
      if( dup2(fd1[0],STDIN_FILENO) != STDIN_FILENO) { // podpinam
	printf("error in dup2(): %s\n",strerror(errno));
	exit(1);
      }
      close(fd1[0]);
    }

    if(fd2[1] != STDOUT_FILENO) { // podpiecie pod standardowe wyjscie
      if( dup2(fd2[1],STDOUT_FILENO) != STDOUT_FILENO) { // podpinam
	printf("error in dup2(): %s\n",strerror(errno));
	exit(1);
      } 
      close(fd2[1]);
    }

    //teraz dziecko ma lacze utworzone z stdin/stdout
    
    printf("czekam\n");  //TU PROGRAM W OGOLE NIE DOCHODZI !!!!!
     while( n=read(STDIN_FILENO,line,MAXLINE) > 0) { // odbierz liste PID
       printf("dostalem: %s\n",line);
       for(j=0;j<strlen(line);j+=sizeof(pid_t)) {
	 tmp = (pid_t*)line;
	 printf("jest pid = %d\n",(int)*tmp);
       }
     }

    
  }
 
  return 0;
}

nie rozumiem dlaczego program nie dochodzi do zaznaczonego miejsca. Czy ktoś jest w stanie pomoc ?