2013-02-14 3 views
0
#include <stdio.h> 
#include <string.h> 
#include <sys/time.h> 
#include <sys/wait.h> 
#include <signal.h> 
#include <fcntl.h> 
#include <unistd.h> 
#include <stdlib.h> 
//Functions Prototype 
void dadstuff(int [], int); 
void kidstuff(int,char*, int [3][2]); 

#define NUM 3; 
int main(int argc, char *argv[]) 
{ 
    int m = rand()%100 + 1; 
    int fd [3][2]; 
    char token[] = "GO_AHEAD\n"; 
    char readbuffer[80]; 
    //printf("%d\n",m); 
    if (argc != 2) /* argc should be 2 for correct execution */ 
    { 
     /* We print argv[0] assuming it is the program name */ 
     printf("usage: [filename]\n"); 
    }else 
    { 
     int val = NUM; 
     int i, dad, kidid[val]; 
     char *name = "dad"; 

     for(i =0; i<val; i++) 
     { 
      if(-1 == (dad = kidid[i] = fork())) 
      { 
       printf("Could not produce kid # %d\n", i+1); 
       //exit(99); 
      } 
      if(!dad) 
       break; 
     } 

     if(dad) 
     { 
      dadstuff(kidid,i); 
      pid_t pid; 
      int status; 

      for(i =0; i<val; i++) 
      { 
       if(-1 == pipe(fd[i])) 
       { 
        fprintf(stderr, "pipe(): Failed to create piple\n"); 
        exit(1); 
       } 
       printf("\nbefore"); 
       printf("\n"); 
       //close(fd[i][0]); //close up input side 
       write(fd[i][1], token, strlen(token)); 


       //Waiting for all child to ends before processing in parent 
       waitpid(kidid[i], &status, 0); 
       printf("\nChild%d, my id is: %d end with status %d\n", i+1, kidid[i],status); 
      } 
      printf("\nParent: Good bye!\n"); 
      printf("\n"); 
     } 
     else 
     { 
      kidstuff(i, argv[1], fd); 
      if(i==0) name = "child1"; 
      if(i==1) name = "child2"; 
      if(i==2) name = "child3"; 

      exit(m); 
     } 
    } 
    //return 0; 
} 
//Parent function 
void dadstuff(int kid[], int n) 
{ 
    printf("\nI am the father of the followings: "); 
    while (n != 0) 
    { 
     if(n == 1) 
      printf("and "); 
     printf("%d ", kid[--n]); 
     //printf("%d----", n); 
    } 
    printf("\n"); 
} 
//Child 1 to 3 function 
void child1(char *fileName) 
{ 
    //do something 
} 
void child2() 
{ 
    //do something 
} 
void child3(char *fileName) 
{ 
    //do something 
} 
void kidstuff(int i, char *fileName, int fd[3][2]) 
{ 
    //close(fd[i][1]); //close up output side 
    char readbuffer[80]; 
    int nbytes = 0; 

    printf("\nI am kid %d and my id is: %d\n", i+1, getpid()); 
    //child 1 
    if(i+1 == 1) 
    { 
     //HOW COME PIPE WASN'T RETURNING ANYTHING?? 
     nbytes = read(fd[i][0],readbuffer,sizeof(readbuffer)); 

     printf("\n"); 
     printf("buffer: %s", readbuffer); 

     while(readbuffer!="GO_AHEAD") 
     { 
      nbytes = read(fd[i][0],readbuffer,sizeof(readbuffer)); 
      printf("buffer: %s", readbuffer); 
      printf("\n"); 
      sleep(1); 
     } 
     child1(fileName); 
    } 

    //child 2 
    if(i+1 == 2) 
    { 
     child2(); 
    } 
    //child 3 
    if(i+1 == 3) 
    { 
     child3(fileName); 
    } 

} 

Я пытаюсь передать строку из родительского процесса в 3 дочерних процесса. Но почему-то весь детский процесс не получал ничего от трубы. Я сделал что-то неправильно? Например, когда я печатаю буфера чтения внутри дочерней функции, я не вижу строку, которую я передал из родительского процесса.Ребенок не получает никаких значений из трубы (родительский процесс)

У кого-нибудь есть идея, почему? Большое спасибо за вашу помощь.

+2

Подождите - вы сначала создаете процессы, а затем - трубку? –

ответ

5

Вы создаете канал в родительском процессе после вилки. Это не сработает: ребенок не видит результат записи родителя в массив fd и не наследует файловые дескрипторы канала.

Первое, что нужно исправить: создать pipe перед началом работы. Существует ряд предостережений, например. если родитель пишет и ребенок читает, ребенок должен close унаследован письмо сторона трубы для обнаружения EOF.

+0

Удивительно! Не могу поверить, что я забыл об этом. –

Смежные вопросы