2016-06-16 2 views
-2

Iam пытается создать код с 1 родителем и 2 детьми. Метод 3 параметра Получать: original_file word1 WORD2Кто-нибудь может помочь мне с моим кодом в c?

родитель читать файл построчно:

  • Если линия пара, отправить строку в метод proccess_pair и word1. Если строка содержит слово 1, сохраните строки в файле_1.txt
  • Если строка нечетна, отправьте строку в метод proccess_odd и слово2. Если строка содержит word1, сохранить строки в file_2.txt

начинающему Im в с, и я пытаюсь с этим:

int p_h1[2] // pipe from parent to child1 
int p_h2[2];// pipe from parent to child2 

int main(int argc, char **argv){ 
    pid_t pdi1, pdi2; 
    FILE *fd; // for original file 
    FILE *p_h1f, *p_h2f; //file create for child1 and child2 respectively 
    char buffer[1024];//buffer 
    if (pid1<0){ 
     fprintf(stderr,"Error fork \n %s \n",strerror(errno)); 
     exit(EXIT_FAILURE); 
     } 
    else if (pid1==0){//Im the child1 
     //proccess for child 1 
     proccess_pair(arg[2]); 
     exit(EXIT_SUCCESS); 
     } 
pid2 = fork(); 
if (pid2<0){ 
    fprintf(stderr,"Error fork \n %s \n",strerror(errno)); 
    exit(EXIT_FAILURE); 
    } 
else if (pid2==0){//Im the child2 
     //proccess for child 2 
     proccess_odd(arg[2]); 
     exit(EXIT_SUCCESS); 
    } 

//Parent dont read from pipe 

close(p_h1[0]); 
close(p_h2[0]); 

fd = fopen(argv[1],"r"); //I openthe file for read it; 

p_h1f = fdopen(p_h1[1],"w") 
p_h2f = fdopen(p_h2[1],"w") 
int i = 1; 

while(fgets(buffer,1024,fd) != NULL){ 
    if (i % 2 ==0){ //check if the lines is pairs 
     fputs(buffer,p_h1f); 
     fflush(p_h1f); 
    }else{ 
     fputs(buffer,p_h2f); 
     fflush(p_h2f);   
    } 
    i++; 
} 
close(p_h1[1]); 
close(p_h2[1]); 
fclose(fd); 
wait(NULL); 
wait(NULL); 
} 

Оба метода (для chil1 и chil2) будет то же самое (но закрытие правильных сторон труб), по этой причине я только реализовать один из них:

void proccess_pair(char *word1){ 
    FILE *fd; 
    fd = fopen("file_1.txt","w"); 
    //closing the not used 
    close(p_h1[1]); 
    close(p_h2[1]); 
    close(p_h2[0]); 

    int nsto = dup(1)//duplicate the stdout 
    dup2(fd,1);//changing stdout->file_1.txt 
    execlp("grep","grep",word1,NULL);//execution of grep 
    exit(EXIT_SUCCESS); 
    } 

Im обучение и я знаю, что у меня есть много много ошибки, поэтому мне нужна помощь.

С уважением

+0

Если вы знаете, как использовать трубку с одним ребенком, попробуйте написать что-нибудь для двух детей и отправьте код. –

+0

@ Jean-BaptisteYunès отредактирован! спасибо ejeje – randall

ответ

0

Как я могу создать много труб в массив в C?

На POSIX-совместимой системы, вы можете сделать это по телефону pipe() много раз по элементам 2D массива int, как вы представили.

¿Я могу использовать две разные трубы (parent-child1, parent-child2)? Я могу использовать массив труб?

Труба сама живет только в ядре. Нет данных в пользовательском пространстве Структура, представляющая трубу, поэтому у вас не может быть массив труб.

Файловые дескрипторы для трубы заканчиваются, однако, являются только int s. Функция pipe() принимает в качестве аргумента указатель на первый элемент массива по меньшей мере двух int и (при успехе) записывает соответствующие дескрипторы файлов в массив.

С точки зрения C нет ничего особенного в массиве, в котором концы труб должны быть возвращены. В частности, это может быть элемент многомерного массива, если вы этого желаете. Или это может быть локальная переменная. Или он может быть членом struct или union. Или это может быть достаточно большой блок динамически распределенного пространства. Это не особенное.

0

Что-то, как это должно работать:

int new_process(char *word){ // return the writing part of a pipe to a newly created child 
    int p[2]; 
    pipe(p); // get a new pipe 
    if (fork()==0) { // create a new child 
    dup2(p[0],0); // child's in is pipe's entry 
    close(p[1]); // close writing part 
    execlp("grep","grep",word,NULL); // exec 
    } 
    close(p[0]); // parent don't need the reading part 
    return p[1]; // send back the writing part to caller 
} 

int main(int argc, char **argv) { 
    int f1 = new_process(argv[1]); // get the pipe to first child 
    int f2 = new_process(argv[1]); // ...second... 
    char buffer[1024];//buffer 

    FILE *fd = fopen(argv[1],"r"); // open the file for reading; 

    while(fgets(buffer,1024,fd) != NULL) { // read aline 
    if (i % 2 ==0) { //check if the line no is pair 
     fputs(buffer,f1); // send it to first child 
     fflush(f1); 
    } else{ 
     fputs(buffer,f2); // send it to second child 
     fflush(f2);   
    } 
    i++; 
    } 
    close(f1); 
    close(f2); 
    fclose(fd); 
    wait(NULL); 
    wait(NULL); 
} 

Не забудьте добавить необходимые элементы управления на неудачах.

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